コンテンツにスキップ

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を同じ名前にそろえる。


Apache用のディレクトリを作成する。

Terminal window
sudo install -d -o root -g root -m 700 \
/etc/apache2/tls/www.example.com

証明書チェーンと秘密鍵を配備する。

Terminal window
sudo install -o root -g root -m 644 fullchain.pem \
/etc/apache2/tls/www.example.com/fullchain.pem
sudo install -o root -g root -m 600 privkey.pem \
/etc/apache2/tls/www.example.com/privkey.pem

fullchain.pemには、サーバー証明書、その発行者であるIntermediate CA証明書の順で格納する。Root CA証明書はサーバーから送信するチェーンには含めず、クライアント側のTrust Storeへ登録する。

privkey.pemはパスフレーズなしのサービス配備用秘密鍵である。root所有・600として、Apacheの親プロセス以外から読み取られないようにする。


Terminal window
sudo a2enmod ssl

a2enmod sslはmod_sslを有効化する。Debianのsslモジュール設定が読み込まれると、/etc/apache2/ports.conf内のListen 443も有効になる。

有効になったことを確認する。

Terminal window
sudo apache2ctl -M | grep ssl

期待する表示はssl_moduleである。


/etc/apache2/sites-available/www.example.com.confを次の構成にする。

/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を参照する。


Terminal window
sudo apache2ctl configtest
sudo systemctl reload apache2

configtestでSyntax OKが表示されてからreloadする。

VirtualHostを確認する。

Terminal window
sudo apache2ctl -S

TCP 80とTCP 443の両方にwww.example.comが表示されることを確認する。

待ち受けポートを確認する。

Terminal window
sudo ss -lntp | grep apache2

80番と443番で待ち受けていることを確認する。


6. クライアントへRoot CA証明書を登録する

Section titled “6. クライアントへRoot CA証明書を登録する”

独自CAで発行した証明書を使う場合は、検証用クライアントへRoot CA証明書を登録する。Debianクライアントでの例を示す。

Terminal window
sudo install -o root -g root -m 644 ca.crt \
/usr/local/share/ca-certificates/skills-root-ca.crt
sudo update-ca-certificates

クライアントはRoot CAを信頼の起点とし、Apacheが送るサーバー証明書とIntermediate CA証明書をたどって検証する。


Terminal window
curl -I https://www.example.com/

期待する結果は200 OKである。

HTTP/1.1 200 OK

証明書チェーンとホスト名を詳しく確認する。

Terminal window
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を使う。

Terminal window
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を確認できる。