HTTPS対応 - Let's EncryptでのSSL証明書の取得・更新・更新の自動化
Let's EncryptのSSL証明書の取得・更新・更新の自動化の方法を解説します。
Let's EncryptでのSSL証明書の取得の前提
Let's Encryptでは、Let's Encryptのクライアントが、Webサーバーにアクセスして、ドメイン所有者であることを確認する流れて、SSL証明書の発行を行います。
このため、PerlでHTTPS対応のWebシステム開発環境を構築する前提として、Apacheの設定を終えて、Webアプリケーションが起動し、リバースプロキシで接続されている必要があることに注意してください。
DNSサーバーにおけるドメイン名とIPアドレスの設定
本番サーバーで運用する場合は、ドメイン名とそれに紐づけられたサーバーのIPアドレスの対応をDNSサーバーで設定する必要があります。
ドメインを取得したサービスにおけるDNSサーバーの設定において、ドメイン名とサーバーのIPアドレスとの対応を記述してください。
ここでは、www.mydomain.exampleというドメイン名のAレコードが、サーバーのIPアドレス「111.122.133.144」に設定されているとして解説します。
certbotのインストール
Let's Encryptのクライアントアプリケーションであるcertbotをインストールしてください。
Webアプリケーションの起動
次の手順で、Webアプリケーションを起動するところまでを行ってください。
バーチャルホストとリバースプロキシの設定
次の手順で、Webアプリケーションをリバースプロキシから接続する手順を行ってください。
自己SSL証明書を使って、Apacheの設定ファイルを記述する
次の手順で、自己SSL証明書の記述を行うところまで進めてください。
Let's EncryptでのSSL証明書の取得
myappというユーザー名で、ホームディレクトリの下に、Myappという名前で、Mojoliciousアプリケーションを作成したと想定して解説します。
またドメイン名は、www.mydomain.exampleという名前で取得しており、DNSサーバーにおける、ドメイン名とIPアドレスの対応の記述は済んでいるということ想定しています。
以下のcertbotコマンドを実行してください。
sudo certbot certonly --agree-tos --non-interactive -d www.mydomain.example --webroot -w /home/myapp/myapp/public --email kimoto.yuki@gmail.com
もしApacheに自動設定するか聞かれた場合は、Noを選んでください。
SSL証明書が以下のディレクトリに作成されます。上から、SSLの証明書ファイル、SSL証明書の秘密鍵ファイル、中間証明書ファイルです。
/etc/letsencrypt/live/www.mydomain.example/cert.pem /etc/letsencrypt/live/www.mydomain.example/privkey.pem /etc/letsencrypt/live/www.mydomain.example/chain.pem
以下の手順で、Apacheの設定ファイルにSSL証明書を追加してください。
Let's EncryptでのSSL証明書の更新
Let's EncryptでのSSL証明書の更新には「certbot renew」コマンドを使用します。取得したすべてのSSL証明書に対して更新が必要かどうかの確認が行われ、更新期限が1ヵ月以内であれば証明書が更新されます。
sudo certbot renew -q --no-self-upgrade --post-hook "systemctl reload apache2"
SSL証明書の更新後、SSL証明書を再読み込みするために、systemctlコマンドでApacheの再起動をしますので、注意してください。設定ファイルが間違っていた場合は、Apacheが止まります。
Let's EncryptでのSSL証明書の更新の自動化
Let's EncryptでのSSL証明書の更新を手動で行うのは、手間がかかります。一週間に一回、自動的に更新するように設定しておきましょう。
一日一回の場合は、もしcertbotが間違っていた場合に、大量にSSL証明書を発行してしまって、しばらくSSL証明書が取得できないという事態になる可能性があるので、やめておきた方がリスクは避けられます。
1ヵ月に一回だと、もう少し頻度を上げた方が、間違っている場合の確認がしやすいかなと感じます。
というわけで、ここでは、1週間に1回、月曜日の9時に更新するという記述にしておきます。
rootのcrontabを設定
rootのcrontabを設定しましょう。
sudo crontab
crontabが起動したら、以下の内容を記述しましょう。viの使い方はこちら。
0 9 * * 1 certbot renew -q --no-self-upgrade --post-hook "systemctl reload apache2"