SSL証明書の設定をApacheの設定ファイルに記述する
SSLの設定をApacheの設定ファイルの例を紹介します。
ApacheでHTTPSを有効にする場合は、Let's Encryptなどを使ってSSL証明書を取得して、Apacheの設定ファイルにSSLの設定を行う必要があります。
SSLの設定で行うことは、二種類あって、すべてのサイトで共通させるSSLの基本設定と、各サイトごとに異なるSSL証明書のパスの設定です。
SSLの基本設定
SSLの基本設定の例です。必須であるのは「SSLEngine on」です。残りの設定は、SSLのセキュリティの脆弱性を減らし、セキュリティを高めるための設定です。
これは、Let's Encryptが設定したSSLの設定をそのまま記載したものです。
SSLEngine on SSLProtocol all -SSLv2 -SSLv3 SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS SSLHonorCipherOrder on
すべてのサイトで共通させることができるので「conf-available/ssl-basic.conf」というファイル名をviエディタで作成して、各サイトのバーチャルホストの設定からインクルードしましょう。
cd /etc/apache2 sudo vi conf-available/ssl-basic.conf
Apache設定ファイルでインクルード。
Include conf-available/ssl-basic.conf
各サイトごとのSSL証明書のパスの設定
各サイトごとのSSL証明書のパスの設定ですが、三つのファイルのパスを記載する必要があります。SSLは公開鍵認証なので、サーバー側に秘密鍵が必要であること、中間証明書が合わせて必要なことを覚えておきましょう。実装の詳細などの詳しい内容については、セキュリティの専門家の方にお尋ねください。
- SSL証明書
- SSL証明書の秘密鍵
- SSL証明書の中間証明書
これを各サイトのバーチャルホストの設定に記述しましょう。以下は、Let's Encryptで生成された、SSL証明書のファイルです。
SSLCertificateFile /etc/letsencrypt/live/www.mydomain.example/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/www.mydomain.example/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/www.mydomain.example/chain.pem
設定ファイルを作成する手順
ここで、SSLの設定ファイルを作成する手順について書いておきます。実は、Let's Encryptで生成された、SSL証明書を利用する場合は、一度でApacheの設定ファイルの設定を行うことができないからです。
なぜなら、Let's Encryptは、実際にそのHTTPサーバーにアクセスできるということで、SSL証明書の所有者の確認を行うからです。
つまり、まず最初に、80番ポートで、Let's Encryptからくる確認のHTTPリクエストがアクセス可能な状態にして、おく必要があります。
ただし、HTTPで80番ポートで設定して、また443のHTTPSの設定を行うということは、面倒です。
ですので、80番ポートで、受けたHTTPリクエストは最初から、HTTPS(443)にリダイレクトするようにしておきましょう。リバースプロキシで、Webアプリケーションが起動していることを前提とします。
SSLの設定を有効にして、最初から準備されている自己SSL証明書を読み込みます。「SSLEngine on」だけでは、HTTPSでの接続に失敗するので注意しましょう。
<VirtualHost *:80> ServerName www.mydomain.example RewriteEngine on RewriteRule (.*)?$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] </VirtualHost> <VirtualHost *:443> ServerName www.mydomain.example <Proxy *> Require all granted </Proxy> ProxyRequests Off ProxyPreserveHost On ProxyPass / http://localhost:20013/ keepalive=On ProxyPassReverse / http://localhost:20013/ RequestHeader set X-Forwarded-Proto "https" SSLEngine on SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key </VirtualHost>
そして、SSL証明書が取得できると、以下の設定に修正します。
Let's Encryptのcertbotが自動的にApacheのSSL証明書の設定してくれる場合もあるのですが、Apacheの設定ファイルのディレクトリ外から設定ファイルを読み込むため、Gitでの設定ファイルの管理のしやすさという面を考慮して、手動で設定することをお勧めしておきます。
<VirtualHost *:80> ServerName www.mydomain.example RewriteEngine on RewriteRule (.*)?$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] </VirtualHost> <VirtualHost *:443> ServerName www.mydomain.example <Proxy *> Require all granted </Proxy> ProxyRequests Off ProxyPreserveHost On ProxyPass / http://localhost:20013/ keepalive=On ProxyPassReverse / http://localhost:20013/ RequestHeader set X-Forwarded-Proto "https" Include conf-available/ssl-basic.conf SSLCertificateFile /etc/letsencrypt/live/www.mydomain.example/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/www.mydomain.example/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/www.mydomain.example/chain.pem </VirtualHost>
必要になるApacheのモジュール
上記のSSL対応のApacheの設定ファイルを記述するためには、以下のモジュールが有効にする必要があります。