HTTPSサイトの設定
HTTP用VirtualHostへHTTPS用VirtualHostを追加し、証明書と秘密鍵を使ってTLS接続を受ける。
| 項目 | 値 |
|---|---|
| OS | Debian 13.x |
| サイト名 | www.example.com |
| ドキュメントルート | /var/www/html |
| VirtualHost設定 | /etc/apache2/sites-available/www.example.com.conf |
| 証明書 | /etc/apache2/tls/www.example.com/fullchain.pem |
| 秘密鍵 | /etc/apache2/tls/www.example.com/privkey.pem |
| HTTPSポート | TCP 443 |
HTTPサイトの設定が完了し、fullchain.pemとprivkey.pemが作成済みであることを前提とする。証明書の作成はServer Certificateの作成を参照する。
証明書のSANにはDNS:www.example.comを含める。接続時のホスト名、ServerName、証明書のSANを同じ名前にそろえる。
1. 証明書と秘密鍵を配備する
Section titled “1. 証明書と秘密鍵を配備する”Apache用のディレクトリを作成する。
sudo install -d -o root -g root -m 700 \ /etc/apache2/tls/www.example.com証明書チェーンと秘密鍵を配備する。
sudo install -o root -g root -m 644 fullchain.pem \ /etc/apache2/tls/www.example.com/fullchain.pemsudo install -o root -g root -m 600 privkey.pem \ /etc/apache2/tls/www.example.com/privkey.pemfullchain.pemには、サーバー証明書、その発行者であるIntermediate CA証明書の順で格納する。Root CA証明書はサーバーから送信するチェーンには含めず、クライアント側のTrust Storeへ登録する。
privkey.pemはパスフレーズなしのサービス配備用秘密鍵である。root所有・600として、Apacheの親プロセス以外から読み取られないようにする。
2. SSLモジュールを有効化する
Section titled “2. SSLモジュールを有効化する”sudo a2enmod ssla2enmod sslはmod_sslを有効化する。Debianのsslモジュール設定が読み込まれると、/etc/apache2/ports.conf内のListen 443も有効になる。
有効になったことを確認する。
sudo apache2ctl -M | grep ssl期待する表示はssl_moduleである。
3. HTTPS用VirtualHostを追加する
Section titled “3. HTTPS用VirtualHostを追加する”/etc/apache2/sites-available/www.example.com.confを次の構成にする。
<VirtualHost *:80> ServerName www.example.com DocumentRoot /var/www/html
<Directory /var/www/html> AllowOverride None Require all granted </Directory>
ErrorLog ${APACHE_LOG_DIR}/www.example.com-error.log CustomLog ${APACHE_LOG_DIR}/www.example.com-access.log combined</VirtualHost>
<VirtualHost *:443> ServerName www.example.com DocumentRoot /var/www/html
SSLEngine On SSLCertificateFile /etc/apache2/tls/www.example.com/fullchain.pem SSLCertificateKeyFile /etc/apache2/tls/www.example.com/privkey.pem
<Directory /var/www/html> AllowOverride None Require all granted </Directory>
ErrorLog ${APACHE_LOG_DIR}/www.example.com-ssl-error.log CustomLog ${APACHE_LOG_DIR}/www.example.com-ssl-access.log combined</VirtualHost>HTTP用VirtualHostを残したまま、同じホスト名とドキュメントルートを持つHTTPS用VirtualHostを追加する。証明書と秘密鍵のパスは手順1で配備したファイルに合わせる。VirtualHostの選択はVirtualHostと設定セクション、SSLEngine、証明書、秘密鍵の役割はHTTPSとTLSを参照する。
4. TLSバージョンを明示する場合
Section titled “4. TLSバージョンを明示する場合”使用するTLSバージョンをVirtualHostで明示する場合は、任意で次を追加する。
SSLProtocol -all +TLSv1.2 +TLSv1.3-allで一度すべて無効にし、TLS 1.2とTLS 1.3だけを有効にする。Debian側の共通mod_ssl設定で同等のポリシーが適用されている場合は、このディレクティブをVirtualHostへ重ねて書く必要はない。
SSLProtocolの指定方法と共通設定との関係はHTTPSとTLSを参照する。
5. 構文を確認して反映する
Section titled “5. 構文を確認して反映する”sudo apache2ctl configtestsudo systemctl reload apache2configtestでSyntax OKが表示されてからreloadする。
VirtualHostを確認する。
sudo apache2ctl -STCP 80とTCP 443の両方にwww.example.comが表示されることを確認する。
待ち受けポートを確認する。
sudo ss -lntp | grep apache280番と443番で待ち受けていることを確認する。
6. クライアントへRoot CA証明書を登録する
Section titled “6. クライアントへRoot CA証明書を登録する”独自CAで発行した証明書を使う場合は、検証用クライアントへRoot CA証明書を登録する。Debianクライアントでの例を示す。
sudo install -o root -g root -m 644 ca.crt \ /usr/local/share/ca-certificates/skills-root-ca.crtsudo update-ca-certificatesクライアントはRoot CAを信頼の起点とし、Apacheが送るサーバー証明書とIntermediate CA証明書をたどって検証する。
7. HTTPSで確認する
Section titled “7. HTTPSで確認する”curl -I https://www.example.com/期待する結果は200 OKである。
HTTP/1.1 200 OK証明書チェーンとホスト名を詳しく確認する。
openssl s_client \ -connect www.example.com:443 \ -servername www.example.com \ -verify_hostname www.example.com \ -showcerts </dev/null-servernameはTLSのSNIとしてVirtualHost名を送り、-verify_hostnameは証明書のSANと接続名を照合する。最終行付近のVerify return code: 0 (ok)が検証成功の目安である。
DNSをまだ用意していない場合は、curl --resolveを使う。
curl -I \ --resolve www.example.com:443:192.0.2.10 \ https://www.example.com/apache2ctl configtestがSyntax OKになる。apache2ctl -Mにssl_moduleが表示される。apache2ctl -Sに*:443のwww.example.comが表示される。- 証明書のSANに
www.example.comが含まれる。 - Apacheがサーバー証明書とIntermediate CA証明書を送信する。
- クライアントがRoot CAを信頼している。
curlで証明書検証を無効化せずに200 OKを確認できる。
-
mod_ssl
SSLEngine、証明書、秘密鍵、TLSの設定。 -
SSL/TLS Strong Encryption: How-To ApacheでHTTPSを構成する例。