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

  • Ubuntu20
  • Ubuntu18
  • Ubuntu16

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"