Webセキュリティの小部屋さんで下記の記事が公開されていて、無料の SSL (TSL) サーバ証明書を提供する認証局 「Let's Encrypt」 からの証明書取得がとっても簡単になったということなので、ちょっと試してみましたが、とっても簡単だったのでメモ。
たった 2コマンドで SSL 証明書の取得が完了
Let's Encrypt は元々簡単な処理でドメイン認証 (Domain Validation / DV) 証明書を取得することができて、私もテストで何度か設定してみたりしていたのですが、ある程度触ったところで、簡単そうだし手が空いたら本番サーバでも設定して使ってみようかな~ なんて思っていたらそのまま手つかずという感じで時間が経っていました。
ところが今回の記事をきっかけに再度触ってみたらあまりに簡単すぎて、思わずその勢いでいくつかの運営サイトを SSL(TSL) に対応させてしまいました。
すでにこの Blog を含め、いくつかのドメインを SSL でホストしているサーバでの設定だったので、実質 2コマンド打つだけで SSL 証明書の取得が完了。あとは Apache に設定して再起動すれば終わりという、ものの数分で 1サイトの設定が終わってしまったのには驚きました。
具体的な設定手順
詳しい設定は上記リンク先にわかりやすく書いてありますのでそちらを見ていただくとして、私の環境だと下記のような感じ。
まず前提として、
- すでに複数の SSL 対応した Web サイトをホストしていて、httpd、openssl、mod_ssl など各パッケージは当然導入、設定済み
- EPEL リポジトリも元々導入済み
- 今回 SSL 対応させる Web サイトも新規ではなく、すでに稼働中のサイト
- CentOS7、Apache 2.4.23 で運用
ということで、私が証明書を取得するために打ったコマンドは下記の 2つだけ。
# yum -y install python-certbot-apache
としてまずは Apache 用の Certbot パッケージをインストール。次に
# certbot --apache
としてウィザードを立ち上げます。
ここから先はウィザード形式なので、聞かれたことに答えていくだけ。
まず私の環境では、バーチャルホストの設定を httpd.conf ではなく、別ファイルに記述して読み込んでいる関係からか、下記のように 「ホスト名の設定が見つからないけどマニュアルで設定する?」 のように聞かれました。「Yes」 を選択して次に進みます。
すると証明書を発行するドメイン名を入れろと言われます (要するに証明書のコモンネーム)。Let's Encrypt はワイルドカード証明書の発行には対応していませんので、*.example.com
のような指定はできませんが、カンマかスペースで区切ることで複数のドメインを指定できますので、事実上ワイルドカードみたいなものです。
下の例では 1ドメインだけ指定していますが、例えば www 付きのコモンネームでも同じ証明書を使用したい場合はカンマ、もしくはスペースで区切って www.example.com,example.com
または www.example.com example.com
のように入力すれば大丈夫。「了解」 を選択して次に進みます。
次にメールアドレスを聞かれますので入力します。このアドレスは緊急の通知や鍵を紛失したときの復旧、証明書の有効期限が近付いた場合の通知に使用されますのできちんと受け取れるものにしましょう。
最後に利用規約に同意してねと言われますので問題なければ同意 (Agree) を選択すると証明書の取得が行われます。
下記のような感じでメッセージが表示されます。「有効期限は 2017-01-03 だからな(発行日から 90日)」 という注意書きも見られます。
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will expire on 2017-01-03. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew"
証明書は /etc/letsencrypt/live/[指定したドメイン名]/
に保存されます。保存されるのは下記の 4ファイル。
- cert.pem (サーバ証明書)
- chain.pem (中間証明書)
- fullchain.pem (上段:サーバ証明書 / 下段:中間 CA 証明書)
- privkey.pem (秘密鍵 / Private Key)
Apache 2.4.7 以前なら下記のように設定してあげれば OK。
SSLCertificateFile /etc/letsencrypt/live/[ドメイン名]/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/[ドメイン名]/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/[ドメイン名]/chain.pem
私の環境は Apache 2.4.23 なので、SSLCertificateChainFile
ディレクティブは使用せず、下記のように SSLCertificateFile
ディレクティブにサーバ証明書と中間 CA 証明書を組み合わせた fullchain.pem
を指定します。
SSLCertificateFile /etc/letsencrypt/live/[ドメイン名]/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/[ドメイン名]/privkey.pem
あとは Apache を再起動し、設定した内容を有効にしたら実際のホストに https でアクセスしてみて問題がないか確認します。問題なく接続できて、下記のように証明書が確認できればとりあえず問題なし。
既存サイトを SSL に対応させた場合は、混在コンテンツなどに気をつけましょう。SSL 対応時に必要になる作業としては下記が参考になると思います。
証明書だけの話ではありませんが、サーバ側の SSL 関連設定について確認したい場合は SSL Server Test による確認が便利です。
自動更新の設定
最後に証明書の自動更新設定を行います。前述したとおり、Let's Encrypt から発行される証明書は有効期限が 90日と短く、頻繁に更新が発生するので、更新作業を自動化しておかないと運用時に現実的ではありません。
CentOS の場合は、下記のコマンドを cron に設定して適当な間隔で実行してあげればよいだけ。
# certbot renew --quiet
私は cron の設定を /etc/crontab
に書いていますので、
0 2,5 */7 * * root certbot renew --quiet
を追記して完了。7日おきに 時間を変えて 2回アップデートを実行しています。cron への設定前に certbot renew --dry-run
を実行して自動更新が正常に完了するかのテストをして問題ないなら設定しましょう。
1日に 2回実行しているのは、下記のように Certbot のドキュメントで、何らかの理由で更新に失敗したときに備えて 1日に 2回実行しといた方がいいよと書かれているからです。
Note:
if you're setting up a cron or systemd job, we recommend running it twice per day (it won't do anything until your certificates are due for renewal or revoked, but running it regularly would give your site a chance of staying online in case a Let's Encrypt-initiated revocation happened for some reason). Please select a random minute within the hour for your renewal tasks.Certbot から引用
ドキュメントではなるべくランダムな時間に実行した方がいいよと書いてあるのですが、面倒なので実行日の朝 2時と 5時にそれぞれ実行されるように設定してみました。運用しつつ様子を見てみようと思います。
HSTS を有効にして完了
ひと通り今回対応したサイトを確認して問題なさそうだったので、HSTS (HTTP Strict Transport Security) を有効にして https でのアクセスのみに制限しました。
この辺の詳しい話は下記のエントリーが参考になると思います(長いよ)。
今回 SSL 対応してみたのはサブで書いている雑記的 (といってもほぼサッカー観戦記なんですけどね) なブログと、ペライチで作成してあるポートフォリオサイトの 2つ。
どちらもわざわざ SSL 証明書を購入してまで対応するのはダルいなと思っていたサイトですが、Let's Encrypt と Certbot のおかげで簡単に SSL 対応させることができました (冒頭にも書いたとおり、元々簡単だったんですけどもより簡単に)。
DV 証明書で問題ない Web サイトであれば手軽に SSL 対応させられますのでお勧めです。