【無料SSL化】EC2でLet's EncryptのSSLサーバ証明書を取得する


環境

・ec2(Amazon Linux2)
・Apache2.4

すでにやってある事と想定

・ec2にウェブサーバApacheはインストール済み、独自ドメインは取得済み、DNSのAレコードは設定済みで、「http://(独自ドメイン)」にアクセスできる状態。
・epelインストール済み
・ELBやACMは使わない。1つのec2での運用を想定。ec2にあるApacheにSSL証明書を導入してSSL化する。

Let's EncryptのSSL証明書を初めて取得する

apacheの拡張モジュールmod_sslをインストールする。自分の環境ではopensslは最初から入っていましたが、opensslがないならインストールも必要だと思います。

$ sudo yum -y install mod_ssl

続いて、Let's EncryptのSSL証明書を取得するためにcertbotをインストールする。

$ sudo yum -y install certbot

そして、Let's EncryptのSSL証明書等を取得します。
ここでは、(独自ドメイン)と(www.独自ドメイン)をSSL化して、https://(独自ドメイン)とhttps://(www.独自ドメイン)でアクセスできるようにします。
あと、下のコマンドはApacheは起動したままだとエラーが出たので、停止してから実行しました。

$ sudo certbot certonly --standalone -d (独自ドメイン) -d (www.独自ドメイン) -m (EMAIL)
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for (独自ドメイン)
http-01 challenge for (www.独自ドメイン)
Waiting for verification...
Cleaning up challenges
〜

これで問題なくできていれば、SSLサーバ証明書(中間証明書込み)と秘密鍵が以下のパスに生成されます(下のパスはシンボリックリンク)。

#SSLサーバ証明書(中間証明書込み)、
/etc/letsencrypt/live/(独自ドメイン)/fullchain.pem
#秘密鍵
/etc/letsencrypt/live/(独自ドメイン)/privkey.pem

続いて、取得したSSLサーバ証明書と秘密鍵をApacheに導入するためにssl.confファイルを編集します。編集箇所は2箇所です。
SSLCertificateFile /etc/pki/tls/certs/localhost.crtSSLCertificateKeyFile /etc/pki/tls/private/localhost.keyの2行をコメントアウトし、取得したSSLサーバ証明書と秘密鍵のパスを新しく指定します。

/etc/httpd/conf.d/ssl.conf
#SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateFile /etc/letsencrypt/live/(独自ドメイン)/fullchain.pem

#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SSLCertificateKeyFile /etc/letsencrypt/live/(独自ドメイン)/privkey.pem

以上で終了ですので、Apacheを起動します。
アクセスするとブラウザのURLの左に鍵アイコンができていて、証明書を見るとLet's Encryptとなっていました。

Let's EncryptのSSL証明書の更新(再取得)をcronで自動化(2回目以降)

Let's EncryptのSSL証明書の有効期限は3ヶ月なので、有効期限が切れる前にSSL証明書を取得し直す必要があります。

SSL証明書の更新処理は自動化したいので、cronで設定しました。

$ crontab -l
5 5 2,17 * * sudo certbot renew --pre-hook "systemctl stop httpd" --post-hook "systemctl start httpd"

月2回(2日と17日)、5時5分に実行するようにしています。日にちや時刻は適当です。
月2回実行しているのは、更新処理を失敗したときなどを考えて余裕を持つためです。
SSL証明書の再取得は、証明書の有効期限が1ヶ月を切らないとできませんが、1ヶ月以上ある時に取得処理を申請してもスルーされるだけなので、問題ないでしょう。

あと、上のコマンドでは、--pre-hookでApacheを停止してからcertbot renewコマンドを実行して、--post-hookでApahceを起動しなおしています。

これで設定は完了です。あとは実際にcronが実行してくれて、SSL証明書を再取得してくれることを祈るのみです。

参考サイト

Let’s Encrypt
Certbot
Let’s EncryptにSSL証明書の取得の申請し、ウェブサイトをSSL化する【無料で初めてのhttps】
Let’s EncryptのSSL証明書を更新する(手動と自動更新)