Let’s Encryptを用いてサイトをSSL通信対応させる方法(CentOS+Apacheの組み合わせ)

WebブラウザとWebサーバ間での通信を暗号化して安全なデータのやり取りを行えるようにするには、Webサイトをhttps化する必要がある。Symantec社やグローバルサイン社などの認証局が発行したSSL/TLSサーバ証明書をサーバに設置してhttps化する方法があるが、証明書の発行には毎年多額の費用がかかってしまう。

その点、Let’s Encryptは無料で発行できるSSL/TLS証明書で、誰でも手軽に利用できるところが魅力となっている。https化を手軽に行いたいのであればLet’s Encryptによるhttps化は選択肢の1つになる。

Let’s Encryptの設定方法についてApacheにLet’s Encryptを設定するという条件で解説する。

まずはApacheにmod_sslをインストールする。

# yum install -y mod_ssl

続いて、certbotをインストールする。

# yum install python-certbot-apache

あとはいったんApacheを停止して以下のコマンドを実行すれば対話的にインストールを進めることができる。

$ certbot --apache certonly

インストールされたSSLサーバー証明書は/etc/letsencrypt/live/にドメインごとに作成される。あとはその証明書のパスを443ポートで各ドメインに対して指定すればインストールは完了となる。例えば、virtualhostの設定ファイル/etc/httpd/conf.d/virtual.confに以下の記述を追加する。

SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES:!RC4:!DH
SSLHonorCipherOrder On
Header set Strict-Transport-Security "max-age=315360000;"
<VirtualHost *:443>
  ServerName example.com
  DocumentRoot /var/www/html/example.com/public_html
  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
</VirtualHost>

VirtualHostの前の記述はセキュリティ対策で必須になる。SSL Server Testでセキュリティ強度を確認できる。

Let’s Encryptは90日で有効期限が切れてしまう。そのため、90日以内に新しい証明書に更新する必要がある。自動更新の設定をcronに追加する。Apacheの場合は/etc/crontabを開いて以下の記述を加える。

0 1,11 * * * root certbot renew --quiet

これで1日に2回自動更新が実行される。万が一1回目の証明書の更新で失敗した場合に備えて2回実行している。もちろんcronを設定していても気づいたときにcertbot renewを実行しておけば安心できる。

なお、証明書を設定していたドメインを証明書の自動更新前にバーチャルホストから削除するときは、/etc/letsencrypt/renewal/にあるそのドメインのconfファイルの削除と/etc/letsencrypt/live/にあるそのドメインのディレクトリを削除する必要がある。