Let's Encryptを使ってSSL証明書を自動更新する(AWS/Amazon Linux/Apache)

  • 9
    Like
  • 0
    Comment

Let's Encryptとは

詳しい説明はこちら。要は、

  • 無料で
  • 自動更新できる
  • SSL証明書導入システム

環境

  • AWS Amazon Linux
  • Apache 2.4.23

手順

全部rootでやってますが、適宜読み替えてください。

Let's Encryptのインストール

terminal
sudo curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
sudo chmod 700 /usr/bin/certbot-auto

あるいは各種パッケージ管理システムを使ってインストール

証明書の作成

terminal
sudo /usr/bin/certbot-auto certonly --webroot -w /var/www/html --email test@example.com --debug -d test.example.com
  • 必要があれば、関係するパッケージが更新・インストールされる。その場合は、再度上のコマンドを入れないといけないかも。
  • dオプションでドメインを指定するが、-d example.com -d test.example.comのように複数指定できる。最初に記述したドメインがコモンネームになる。
    • ちなみに、指定するすべてのドメインは、このサーバに向いたAレコードを持っていないといけない。
    • wオプションでドキュメントルートディレクトリを指定する。ドメインごとに別のドキュメントルートディレクトリを指定したいときには、-dオプションの直前に-wオプションを書けば良い。
  • すべて完了すると、 下記のパスに証明書と鍵が発行される。
/etc/letsencrypt/live/test.example.com/fullchain.pem 
/etc/letsencrypt/live/test.example.com/privkey.pem

証明書の指定

ここは、通常のApacheの指定と変わらない。nginxでも同様でしょう。例えば下記のような感じ。

terminal
sudo vi /etc/httpd/conf.d/ssl.conf
/etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/letsencrypt/live/test.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/test.example.com/privkey.pem

で、サーバ再起動。ブラウザで開いて確認しましょう。

terminal
sudo service httpd restart

自動化

Let's Encryptは3ヶ月しか有効期限がないので、自動更新するとよい。更新のためのコマンドをcronする。
まず、下記のコマンドが正常に動作し、証明書が更新されるかをテスト。

terminal
sudo /usr/bin/certbot-auto renew --post-hook "sudo service httpd restart"

renewは、すべての証明書を更新するコマンド。--post-hookオプションで指定したコマンドは、renew後に実行される。ただし、renewは期限が迫らないうちは、実行がスキップされ、その場合はpost-hookも実行されない。
いまは証明書を発行したばかりなので、下記のように表示されれば、問題なし。

terminal
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/test.example.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/test.example.com/fullchain.pem (skipped)
No renewals were attempted.
No hooks were run.

OKなら、cronに登録する。まずcronが動いているか確認しよう。

terminal
/etc/rc.d/init.d/crond status

cronに登録するファイルを作成し、以下を記入する。
crontab -eつかっちゃだめ。ぜったい。

terminal
sudo vi /etc/cron.d/letsencrypt
/etc/cron.d/letsencrypt
00 16 * * 2 root /usr/bin/certbot-auto renew --post-hook "service httpd restart"

この例では、毎週火曜の16時にrenewが起動する。
設定が終わったら、実際に起動して更新されるか、期限30日前の火曜に確認しよう。