無料のSSLサーバ証明書(Let’s Encrypt)を用いてホームページを常時SSL化する

無料のSSLサーバ証明書を使用して、ホームページの常時SSL化を図ります。前提条件として、apacheによるホームページが公開されていることです。apacheに関する設定はこちらを参考に準備ください。ブラウザから http://ホスト名.dassyi.com/ としてホームページ内容が見れることを確認しておきます。

自動でサーバ証明書を発行するcertbotのインストール

では、早速 certbotをインストールしていきます。以下のコマンドを実行してください。もしcertbotがないと言われたら、epel-releaseのリポジトリを追加してください。

なお、Snap版のcertbotをインストールする方法もありますが、たくさんのパッケージを必要とするためディスクの容量に影響があるのと、セキュリティの観点から不要なパッケージ、アプリはインストールしないようにするため、epelからインストールしております。

snapとは、liinuxのディストリビューションを問わず利用できる「ユニバーサルパッケージ」で、独立性が高いのが特徴です。要はOSのライブラリのバージョン等の影響は受けませんが、その分必要な独自のパッケージを追加するので、ディスクの使用容量が大きくなる傾向があります。

無料のSSLサーバ証明書を発行する

今回は、apacheが動作している環境ですので、「–webroot」オプションをつけて下記の取得コマンドを実行します。

すると、メールアドレスの入力を促されますので、メールアドレスを入力します。メールアドレスは、緊急の通知、鍵を紛失したときの復旧、証明書の有効期限が近付いた場合の通知に使用されるようです。

次に、Let’s Encrypt の利用規約に同意します。(「Yes]を入力)
その次に、Let’s Encryptパートナーにメールアドレスを公開していいか聞かれるので、「No」を入力します。

この後、実際にサーバにアクセスされて確認しますが、私はFirewalldでガチガチにアクセス制限していたので、失敗しました。ログを確認すると、3つほど80番ポートにアクセスがあり、awsから2つと、letsencrypt.orgから1つアクセスがありました。このうち2つはブラックリストとして登録されておりました。。。(大丈夫か?)

とはいえ、アクセスできないと証明書が発行できないので、いったんfirewalldを停止して、上記コマンドを実行すると、以下の通り成功しました。

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for aws.dassyi.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/aws.dassyi.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/aws.dassyi.com/privkey.pem
This certificate expires on 2023-02-15.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

取得した証明書をapacheに設定しSSL対応を行う

証明書が発行されましたら、ssl.confにLet’sEncryptで発行される証明書とキーのパスを記載します。

SSLCertificateFile /etc/letsencrypt/live/aws.dassyi.com/fullchain.pem

SSLCertificateKeyFile /etc/letsencrypt/live/aws.dassyi.com/privkey.pem

apacheのサービスを再起動して、ブラウザで httpsでアクセスしてみます。
エラーなく表示されていることを確認します。また証明書の中身を確認し、Let’s encryptになっている事と、有効期限が3か月である事を確認します。

証明書の自動更新を行う設定

ここでは発行したSSLサーバ証明書を3か月ごとに自動更新させるために、cronにて自動更新シェルを設定します。
まず、以下のような自動更新シェル(ssl_renew.sh)を作成し、/usr/local/sbin に配置します。

#!/bin/bash

CMD=/usr/bin/certbot

# シスログへ開始を記録
/usr/bin/logger "`date` SSL Certfile Update start"

# 更新前にfirewalldを停止
/usr/bin/systemctl stop firewalld

# certbotコマンドで証明書を更新。更新後apacheを再読み込み
${CMD} renew --post-hook "systemctl reload httpd"

# irewalldを起動
/usr/bin/systemctl start firewalld

# シスログに終了を記録
/usr/bin/logger "`date` SSL Certfile Update end"

このファイルのパーミッションを 700 にして、以下の通りrootユーザにてcrontabに仕掛けます。

30 21 10,20 * * /usr/local/sbin/ssl_renew.sh

こちらは、毎月10日と20日の21時30分に実行する意味になります。

取得した証明書の有効期限が、残り30日未満にならないと更新されないので、しばらく様子見です。
結果は、また報告します。

約2か月後

上記の設定を11月20日頃に実施して、約二か月経過した1月20日のcronで、自動更新されました。

管理者宛てにもメールが届き、更新されなかった場合は、

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/aws.dassyi.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Certificate not yet due for renewal

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
The following certificates are not due for renewal yet:
  /etc/letsencrypt/live/aws.dassyi.com/fullchain.pem expires on 2023-02-15 (skipped)
No renewals were attempted.
No hooks were run.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Saving debug log to /var/log/letsencrypt/letsencrypt.log

のようなメールでしたが、更新された際のメールは、

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/aws.dassyi.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Renewing an existing certificate for aws.dassyi.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all renewals succeeded: 
  /etc/letsencrypt/live/aws.dassyi.com/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Saving debug log to /var/log/letsencrypt/letsencrypt.log

という内容に変わりました。もちろんブラウザから証明書の有効期限が更新されていることも確認済です。

今回はここまです。最後までお読みいただきありがとうございました。