TLS(HTTPS)の利用

HTTPSの利用には、サーバー証明書の取得が必要になります。以前は有料で認証局に発行してもらわなければなりませんでしたが、webサイト全体HTTPS化の流れの中、無料で作れるようになりました。

Apacheの設定

まずは、証明書はテスト用のものを使って設定します。

  1. HTTPSの場合も、通常のHTTPと同様にアクセスしてきたFQDNに対応する設定がない場合は、デフォルト(一番最初にある設定)が使用されます。
    これに対応するため、HTTPと同様に000-defaultにHTTPS用のデフォルト設定も追加してしまいます。
    <VirtualHost *:80>
          (中略)
    </VirtualHost>
    
    <IfModule mod_ssl.c>
    <VirtualHost *:443>
            ServerName localhost
    
            ServerAdmin webmaster@localhost
            DocumentRoot /var/www/html
    
            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined
    
            SSLEngine on
            SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
            SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
    </VirtualHost>
    </IfModule>
  2. sslモジュールを有効にします。
    # a2enmod ssl
    # service apache2 restart
    これで、httpsが使えるようになります。
  3. /etc/apache2/sites-available/default-ssl.confをコピーし、必要な情報を修正します。httpとの違いは、sslに関する設定がいくつか増えるだけです。
    <VirtualHost *:443>
            ServerName tls.example.com
    
            ServerAdmin info@tls.example.net
            DocumentRoot /xxx/tls.example.net
    
            LogLevel warn
    
            ErrorLog ${APACHE_LOG_DIR}/tls.example.com-error.log
            CustomLog ${APACHE_LOG_DIR}/tls.example.com-access.log combined
    
            <Directory /xxx/public_html/tls.example.net>
                    Options -Indexes
                    AllowOverride None
                    Require all granted
            </Directory>
    
            ※ここから下がHTTPS関連の設定
            SSLEngine on
            SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
            SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
    
            <FilesMatch "\.(cgi|shtml|phtml|php)$">
                    SSLOptions +StdEnvVars
            </FilesMatch>
            <Directory /usr/lib/cgi-bin>
                    SSLOptions +StdEnvVars
            </Directory>
    </VirtualHost>
  4. 新しいサイトの設定を有効にします。
    # a2ensite tls.example.com
    # service apache2 reload

http同様に、必要な分だけServerNameごとに定義を追加していきます。

正式な証明書の導入

Let's encryptを使って、正式な証明書を発行してもらいます。

  1. Debian 9(Strech)からは、Let's encrypt用のツールであるcertbotがパッケージ化されています。
    # apt install certbot python-certbot-doc python-certbot-apache python-certbot-apache-doc
  2. certbotをapache用に起動して、質問に答えていきます。
    # certbot --apache
    Which names would you like to activate HTTPS for?
    -------------------------------------------------------------------------------
    1: localhost
    2: tls.example.com
    3: tls.example.jp
    4: tls.example.net ※既存の設定を読み取って、どれをHTTPS化するかリストアップします
    -------------------------------------------------------------------------------
    Select the appropriate numbers separated by commas and/or spaces, or leave input
    blank to select all options shown (Enter 'c' to cancel):2
    Enter email address (used for urgent renewal and security notices) (Enter 'c' to
    cancel):admin@example.com
    
    -------------------------------------------------------------------------------
    Please read the Terms of Service at
    https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
    in order to register with the ACME server at
    https://acme-v01.api.letsencrypt.org/directory
    -------------------------------------------------------------------------------
    (A)gree/(C)ancel:A
    Obtaining a new certificate
    Performing the following challenges:
    tls-sni-01 challenge for ns5.aka-tsuki.net
    Waiting for verification...
    Cleaning up challenges
    Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem
    Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem
    Deploying Certificate to VirtualHost /etc/apache2/sites-available/tls.example.com.conf
    
    Please choose whether HTTPS access is required or optional.
    -------------------------------------------------------------------------------
    1: Easy - Allow both HTTP and HTTPS access to these sites
    2: Secure - Make all requests redirect to secure HTTPS access
    -------------------------------------------------------------------------------
    Select the appropriate number [1-2] then [enter] (press 'c' to cancel):2
    Enabled Apache rewrite module
    Created redirect file: le-redirect-tls.example.com.conf
    Rollback checkpoint is empty (no changes made?)
    
    -------------------------------------------------------------------------------
    Congratulations! You have successfully enabled https://tls.example.com
    
    You should test your configuration at:
    https://www.ssllabs.com/ssltest/analyze.html?d=tls.example.com
    -------------------------------------------------------------------------------
    
    IMPORTANT NOTES:
     - Congratulations! Your certificate and chain have been saved at
       /etc/letsencrypt/live/tls.example.com/fullchain.pem. Your cert
       will expire on 2017-06-02. To obtain a new or tweaked version of
       this certificate in the future, simply run certbot again with the
       "certonly" option. To non-interactively renew *all* of your
       certificates, run "certbot renew"
     - If you lose your account credentials, you can recover through
       e-mails sent to yaw@drunk.jp.
     - Your account credentials have been saved in your Certbot
       configuration directory at /etc/letsencrypt. You should make a
       secure backup of this folder now. This configuration directory will
       also contain certificates and private keys obtained by Certbot so
       making regular backups of this folder is ideal.
     - If you like Certbot, please consider supporting our work by:
    
       Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
       Donating to EFF:                    https://eff.org/donate-le
    以前有料の証明書を購入したことのある人なら分かると思いますが、あまりにあっけなく終わります。あとは、ブラウザなどでアクセスして、正常動作せいているかを確認してください。
    なお、証明書の更新については、/etc/cron.d/certbotに自動チェック&更新が設定されているので放っておけば良い(はず)です。

証明書の更新

Let's encryptで証明書を導入した場合、cron.dに自動更新用のスクリプトがセットされます。ただ、見た感じ証明書の更新だけでApacheのreloadが入っていないようなので、自分で追記が必要かもしれません。
これは、実際に更新が動いてから再確認します。


目次へ戻る