Ubuntu+PerlでWebシステム開発 環境構築

  • Ubuntu20
  • Ubuntu18
  • Ubuntu16

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の設定ファイルを記述するためには、以下のモジュールが有効にする必要があります。