自宅Debian JessieのApacheサーバーに、無料でSSL証明書を発行してくれるLet’s Encryptをインストールしました。2016年4月に公式サービスがスタートし、公式サイトが英語なので大変だなーと思っていたら、現在は日本語のポータルサイトもあります。もうそろそろ、なんとかいけるかなと設定してみました。とりあえずお問合せページだけですが、設定完了しました。
公式サイト(英語)はコチラです。
日本語の総合ポータルサイトはコチラ。
このページの目次
基本方針
2016年7月19日時点での、自宅サーバー、Debian Jessie8、Apache2(バージョン: 2.4.10-10+deb8u4)での方針を考えました。上記総合ポータルの膨大な情報から、家の環境での手順を整理して考えるだけで大変です。
- クライアントソフトウェアは「Let’s Encrypt クライアント」から「Certbot クライアント」に名称変更になって、コマンドもletsencrypt-autoからcertbot-autoに変わっているが、ディストリによってはまだ旧コマンドを使うこともあり。
- ディストリ標準のネイティブパッケージがあればそれを使う。なければGitHubから入手する。
- Debian Jessieは、ネイティブパッケージがまだbackports版しかない。実際に試したところ、リポジトリにはあるがインストールしようとすると拒否されたので、あきらめる。
- GitHubから入手した場合、サブコマンドcertonlyとrenewの証明書発行機能が使えた。run、installのインストール系はApacheに設定されているドメイン名が出てこないので使えなかった。–apacheのプラグインも使えず。
- インストールはエイリアス名で指定すれば、初回の設定だけで済みそうなので、手動設定で問題なし。証明書の有効期限が3ヶ月なので、cronで自動化しないと手動で更新してたら面倒。
設定してみた
手順としては、certonlyで証明書を発行して、手動でApacheにインストール、更新はcronにrenewコマンドで更新日が近づいたときだけ証明書を更新する方針です。
証明書発行
証明書を発行したいドメインが稼働しているサーバーで行う必要があります。まずは、gitで最新のcertbotを入手します。
# git clone https://github.com/certbot/certbot
gitが入ってなければ、先にgitをインストールする必要あり。
# cd certbot
入手したcertbotディレクトリに入ります
# chmod a+x ./certbot-auto
実行権限を与えます
# ./certbot-auto --help
ヘルプを開くついでに動作確認。 ” ./ “を頭に付けないと動作しないので注意。Pythonが入ってないと自動でインストールが始まりました。
# ./certbot-auto certonly
証明書の発行を行います。ここから対話形式で進みます。
インストール前に一度更新
家の環境だけなのかもしれませんが、なぜかこのあとサイトをSSL通信対応に設定すると、証明書更新のcert-auto renewコマンドがエラーで上手く行きませんでした。ポート443(tls-sni-01)で認証しようとしてエラーが帰ってきます。Incorrect validation certificate for TLS-SNI-01 challenge.とか言われます。
いろいろ試してa2dissiteでSSLのバーチャルホストを外したらcertbot-auto renewコマンドが通り、その後SSLを有効にしても成功するようになりました。何故かはわかりませんが、先に一度renewサブコマンドを通しておくのが良さそうです。
./certbot-auto renew --force-renewal
Apacheにインストール
発行された証明書の保存場所がこちら。def-4.com部分はこのサイトのドメイン名です。最後の数字部分が更新される毎に増えていくようです。
- /etc/letsencrypt/archive/def-4.com/cert1.pem …サーバ証明書(公開鍵)
- /etc/letsencrypt/archive/def-4.com/privkey1.pem …秘密鍵
- /etc/letsencrypt/archive/def-4.com/chain1.pem …中間証明書
- /etc/letsencrypt/archive/def-4.com/fullchain1.pem …サーバ証明書と中間証明書が結合されたファイル(今回は未使用)
★実際に設定に使用するのは同時に作成されているエイリアスのファイルを指定します。それによって、3ヶ月毎に証明書ファイルが更新されていっても、Apache側の設定変更をする必要がなくなります。
- /etc/letsencrypt/live/def-4.com/cert.pem…サーバ証明書(公開鍵)
- /etc/letsencrypt/live/def-4.com/privkey.pem…秘密鍵
- /etc/letsencrypt/live/def-4.com/chain.pem…中間証明書
Debian JessieのApacheの場合、この証明書のエイリアスを指定するのは、/etc/apache2/sites-available/default-ssl.confファイルがデフォルトです。これは環境次第で設定するファイルが違いますが、各エイリアスファイルの証明書パスをそれぞれ指定して、e2ensiteで有効にします。
- SSLCertificateFile …サーバ証明書(公開鍵)
- SSLCertificateKeyFile …秘密鍵
- SSLCACertificateFile …中間証明書
SSLEngine on SSLCertificateFile /etc/letsencrypt/live/def-4.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/def-4.com/privkey.pem SSLCACertificateFile /etc/letsencrypt/live/def-4.com/chain.pem
その他、Apache側でSSL通信ができる設定が必要です。Port443をListenにしたり、VirtualHostの設定が出来ている必要があります。この辺は過去記事に詳しく書いています。
Apacheへの設定が終わりましたら、一度はサービスをリロードさせる必要があります。その後、https://~でサイトにアクセスできれば、証明書のインストールは完了です。
service apache2 reload
Cronで証明書の更新自動化
Let’s Encrypt証明書の有効期限は3ヶ月です。そのたびに更新して新しい証明書を発行する必要があります。無料なので、期限ぎりぎりまで粘る必要はないですが、あまりに頻繁な更新も制限されているようです。(たぶん一週間で5回制限)理想としては2ヶ月ちょいで更新していくのが良さそうです。
期限が近くなったら、certbot-auto renewのコマンドを打つだけで良さそうですが、手動で更新していたら、そのうちすっかり忘れて期限切れにしてしまうでしょう。
Cronに設定しておけば、自動で永遠に更新しつづけてくれそうです。renewコマンドは、有効期限が30日以内なら更新、それ以上ならチェックのみでスルーしてくれるので、、週一で深夜にCronに実行させるのが良いかなと思います。オプション-q はエラーがあった時だけメッセージを出してくれるので、cronに設定する場合は付けたほうが良いでしょう。
設定ファイルは /etc/crontab です。毎週金曜日のam4時15分に実行する設定例です。ファイルのパスはフルパスで環境に合わせてください。
# m h dom mon dow user command 15 4 * * 5 root /home/user/certbot/certbot-auto renew -q
–force-renewalでは成功
オプション–force-renewalを付けてCronでの更新テストは成功しています。apacheの停止や再起動やリロードなしで /etc/letsencrypt/archive/〜の証明書ファイルの末尾の数字が増えたファイルが増え続けています。おそらくこれで大丈夫と言えそうですが、最初の証明書期限が来る3ヶ月以上は、様子を見る必要がありそうです。(2016/11/18追記)cronでの自動更新成功確認済み
とりあえずcontactフォームだけ
以上でここのブログにLet’s Encryptの証明書をインストールできました。現在は、WordPress HTTPS(SSL)プラグインを利用して管理画面とお問い合わせページのみSSL対応にしています。
Let’s Encryptが無料でSSL証明書を発行する最大の目的は、サイト全体をSSL通信にすることにあると思うので、ここのブログも全ページSSL対応にしたいところですが、コンテンツ全てをSSL対応に設定するのが結構大変なので、ぼちぼちと準備が出来たら変更予定です。
追記
この記事では、def-4.com単体で取得した証明書の内容でしたが、Let’s Encrypt証明書はSAN(Subject Alternative Name)でwww付きだろうが、複数サブドメインだろうが、別ドメインだとしても証明書一枚で対応可能でした。くわしくは次記事をご覧ください。