手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 22.04 Apache TLS – 内部 CA 証明書で HTTPS を有効化する

Ubuntu 22.04 の Apache で TLS を有効化する場合、作業の中心は証明書ファイルを置くことではなく、TLS 用の VirtualHost を正しく作ることです。証明書、秘密鍵、ServerName、Apache モジュール、サイト有効化、検証までを一連の流れとして扱います。

この記事では、内部 CA や自己署名 CA で発行した証明書を使い、Apache の HTTPS VirtualHost を構成する手順を整理します。公開サイトであれば Let’s Encrypt などの公開 CA を使う方が自然ですが、内部向け Web UI や検証環境では内部 CA の証明書を使う場面もあります。

参考書籍
参考書籍

Apache HTTP Server ポケットリファレンス

Apache HTTP Server の設定、ディレクティブ、モジュール、運用項目を確認したい場合の参考書籍です。古い 2.0 / 2.2 系対応書籍のため、価格や在庫、現在の Apache 2.4 との差分はリンク先や公式ドキュメントで確認してください。

Amazon で見る

このリンクは Amazon アソシエイトリンクです。

関連する記事

Apache TLS は、証明書作成、CA 信頼、Apache 基本設定、HTTP/2、PHP、WAF とつながる記事です。必要な前提に応じて参照してください。

Apache TLS で確認するもの

TLS 有効化では、証明書ファイルだけでなく、秘密鍵の権限、VirtualHost、ServerName、証明書の SAN、クライアント側の CA 信頼を合わせて確認します。

項目役割
SSLCertificateFileApache が提示するサーバー証明書
SSLCertificateKeyFileサーバー証明書に対応する秘密鍵
ServerNameVirtualHost の代表名。証明書の SAN と合わせる
a2enmod sslApache の SSL/TLS モジュールを有効化する
a2ensiteTLS 用 VirtualHost を有効化する
クライアント側 CA 信頼内部 CA 証明書を信頼して証明書検証を通す

証明書と秘密鍵を配置する

ここでは、easy-rsa などで作成した内部 CA 発行の証明書を使う例にします。秘密鍵は誰でも読める状態にせず、Apache が起動時に読める範囲へ絞ります。

sudo install -d -m 0750 -o root -g ssl-cert /etc/ssl/local
sudo install -m 0644 server.example.local.crt /etc/ssl/local/server.example.local.crt
sudo install -m 0640 -o root -g ssl-cert server.example.local.key /etc/ssl/local/server.example.local.key
sudo install -m 0644 internal-ca.crt /etc/ssl/local/internal-ca.crt

Apache が秘密鍵を読めない場合、設定ファイルが正しくても起動に失敗します。一方で、秘密鍵を 0644 のように広く読める権限にするのは避けます。

SSL モジュールを有効化する

Apache の SSL/TLS 機能を有効化します。

sudo a2enmod ssl
sudo systemctl reload apache2

TLS 用 VirtualHost を作成する

既存の default-ssl.conf を直接使っても構いませんが、運用上はサイトごとに VirtualHost ファイルを分ける方が見通しがよくなります。ここでは server.example.local 用の設定を作ります。

sudo tee /etc/apache2/sites-available/server.example.local-ssl.conf <<'EOF'
<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName server.example.local
    ServerAdmin webmaster@example.local

    DocumentRoot /var/www/html

    SSLEngine on
    SSLCertificateFile /etc/ssl/local/server.example.local.crt
    SSLCertificateKeyFile /etc/ssl/local/server.example.local.key

    ErrorLog ${APACHE_LOG_DIR}/server.example.local-ssl-error.log
    CustomLog ${APACHE_LOG_DIR}/server.example.local-ssl-access.log combined
</VirtualHost>
</IfModule>
EOF

内部 CA の証明書を使う場合でも、Apache 側で CA 証明書を信頼させるというより、Apache はサーバー証明書と秘密鍵を提示します。クライアント側がその発行元 CA を信頼しているかが検証のポイントです。

サイトを有効化する

TLS 用 VirtualHost を有効化し、設定構文を確認してから Apache を再読み込みします。

sudo a2ensite server.example.local-ssl.conf
sudo apache2ctl configtest
sudo systemctl reload apache2

apache2ctl configtestSyntax OK でも、秘密鍵の権限や証明書ファイルの不整合で reload 時に失敗することがあります。reload 後のサービス状態も確認します。

sudo systemctl status apache2 --no-pager
sudo journalctl -u apache2 -n 50 --no-pager

curl で確認する

クライアント側で内部 CA を信頼している場合、curl で証明書検証が通るはずです。

curl -v https://server.example.local/

内部 CA をまだ信頼していないクライアントでは、証明書検証エラーになります。その場合は、クライアント側に CA 証明書を配置して update-ca-certificates を実行します。curl -k は確認用の回避策であり、恒久運用の設定ではありません。

openssl s_client で確認する

証明書チェーン、SAN、検証結果を詳しく見る場合は openssl s_client を使います。SNI を使うため、-servername も指定します。

openssl s_client \
  -connect server.example.local:443 \
  -servername server.example.local \
  -verify_return_error \
  -CAfile /etc/ssl/certs/ca-certificates.crt

検証が通る場合は Verify return code: 0 (ok) が表示されます。エラーになる場合は、CA 信頼、SAN、証明書期限、秘密鍵との対応関係を確認します。

証明書と秘密鍵の対応を確認する

証明書と秘密鍵の組み合わせが間違っていると Apache は正しく起動できません。RSA 鍵の場合は modulus を比較できます。

openssl x509 -noout -modulus -in /etc/ssl/local/server.example.local.crt | openssl md5
sudo openssl rsa -noout -modulus -in /etc/ssl/local/server.example.local.key | openssl md5

楕円曲線鍵などでは確認方法が異なるため、証明書作成時のファイル名と配置先を混同しない運用が大切です。

HTTP から HTTPS へのリダイレクト

TLS を有効化することと、HTTP を HTTPS へリダイレクトすることは別の設計です。必要であれば、80 番側の VirtualHost でリダイレクトします。

sudo tee /etc/apache2/sites-available/server.example.local.conf <<'EOF'
<VirtualHost *:80>
    ServerName server.example.local
    Redirect permanent / https://server.example.local/
</VirtualHost>
EOF

sudo a2ensite server.example.local.conf
sudo apache2ctl configtest
sudo systemctl reload apache2

内部向けの検証サーバーでは HTTP を残して切り分けに使う場合もあります。公開サイトや認証を扱うサイトでは、HTTPS への統一を基本にした方が安全です。

運用上の注意

  • 証明書の SAN に実際の接続名を含める
  • 秘密鍵を広い権限で配置しない
  • 証明書検証エラーを -k や検証無効化で恒久回避しない
  • Apache 側の設定とクライアント側の CA 信頼を分けて確認する
  • HTTP/2 や WAF は TLS 有効化後の追加設定として扱う

まとめ

Ubuntu 22.04 の Apache で TLS を有効化するには、a2enmod ssl、TLS 用 VirtualHost、証明書と秘密鍵の配置、apache2ctl configtestcurl / openssl s_client による確認を順に行います。

内部 CA の証明書を使う場合、Apache はサーバー証明書と秘密鍵を提示し、クライアント側が内部 CA を信頼しているかで検証結果が決まります。証明書エラーを回避するのではなく、CA 信頼、SAN、秘密鍵の権限を正しく整えることが安定した TLS 運用につながります。

Ubuntu 22.04 Apache TLS – 内部 CA 証明書で HTTPS を有効化する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る