2018年3月からLetencryptがワイルドカード証明書発行に対応しています。当サイトで利用しているLetencrypt証明書もワイルドカード対応にしてみようかなと、自宅サーバーのDebian GNU/Linux 9(Stretch)のCertbotがBackport版にて対応バージョンになっていたので発行してみました。
結論を先に書いておきますが、現状ではドメインを購入したレジストラのDNSサービス(お名前.com)を利用しているため、ワイルドカード証明書の発行は出来たもののCronで自動更新ができないので、結局元の自動更新ができる証明書に戻して運用することにしたというオチです。
このページの目次
Backports版のCertbotをインストール
Certbotクライアントは、バージョン0.22.0 以上が ACME v2 とワイルドカード証明書に対応しています。
DebianのCertbot安定板はまだバージョン0.10.2ですが、Backport版は0.23.0になっています。
Backport版をインストールできるように /etc/apt/sources.list にリポジトリを追加します。
deb http://ftp.jp.debian.org/debian stretch-backports main contrib non-free
backports版を指定してCertbotをインストールします。
# apt update # apt -a list certbot # apt -t=stretch-backports install certbot # apt -a list certbot
証明書発行
現在、ワイルドカード証明書の取得には DNS-01 Challenge による認証を行う必要があるようです。–manual –preferred-challenges dnsオプションでDNS-01方式になります。
ワイルドカード証明書に対応しているACME v2 エンドポイントを利用するために明示的に–server https://acme-v02.api.letsencrypt.org/directory オプションを付ける必要がありました。
wwwを含むすべてのサブドメインに対応する-d *.def-4.com とサブドメインなしの-d def-4.com のドメインを指定して発行します。
certbot certonly --server https://acme-v02.api.letsencrypt.org/directory --manual --preferred-challenges dns -d def-4.com -d *.def-4.com
DNS-01方式の場合、ポート53を利用して認証しているようです。ファイアウォールでポート53を塞いでいるとエラーで認証できませんでした。
はじめて発行するときはメールアドレスを聞かれるので入力します。そのあともいろいろYesかNoか聞かれるので、Yを入力して進みます。
下図のように、DNSのTXTレコードに設定する値が表示されたら、Enterキーは押さずにそのままにして、DNSの設定を手動で行います。
DNSにTXTレコード追加
当方のサイトは、お名前.comでドメインを取得してDNSサーバーはお名前.comのDNSサービスを利用しています。
お名前.com NAVIサイトにログインして、DNS機能の設定画面でホスト名欄に_acme-challenge 、TYPEをTXT、VALUEにはコピーした値を張り付けて追加設定をします。
しばらく待ってEnterを押す
DNSの設定を変更したら反映されるまでしばらく待ってから先ほどの続きでEnterキーを押します。
WEB上で反映される前にEnterキーを押してしまうと、再度TXTレコードの値が再発行されるだけなので、またDNSの追加設定からやり直しです。
ネットで見ると5分や10分待つというのが多いですが、お名前.comのDNS機能はもっと時間がかかりました。10分でもダメ、90分でもダメ、3時間SSHが切れないようにスリープせずに放置してやっと発行できました。
- /etc/letsencrypt/live/def-4.com-0001/cert.pem…サーバ証明書(公開鍵)
- /etc/letsencrypt/live/def-4.com-0001/privkey.pem…秘密鍵
- /etc/letsencrypt/live/def-4.com-0001/chain.pem…中間証明書
- /etc/letsencrypt/live/def-4.com-0001/fullchain.pem …サーバ証明書と中間証明書が結合されたファイル
このサイトでは、すでに既存のdef-4.comの証明書を発行済みのため、def-4.com-0001という証明書名のディレクトリーが作成されて、そこにワイルドカード対応の証明書が保存されていました。
WEBサーバー(当サイトはNginx)の証明書の指定場所を変更して、Nginxサービスをリロードしたらワイルドカード対応になりました。
Cronで自動更新するには
Letencryptの証明書は有効期限が90日ですが、Cronで自動更新をかけておけば半永久的に自動更新をしてくれるというのが最大の利点です。
だたしこれは、従来通りのHTTP-01もしくはTLS-SNI-01方式で発行した場合の話で、今回のDNS-01方式で発行した証明書は certbot renew コマンドに–force-renewalオプションを付けてテストしてみたらエラーが出て更新できませんでした。
その時のエラーメッセージがこちら。
------------------------------------------------------------------------------- Processing /etc/letsencrypt/renewal/def-4.com-0001.conf ------------------------------------------------------------------------------- Could not choose appropriate plugin: The manual plugin is not working; there may be problems with your existing configuration. The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.',) Attempting to renew cert (def-4.com-0001) from /etc/letsencrypt/renewal/def-4.com-0001.conf produced an unexpected error: The manual plugin is not working; there may be problems with your existing configuration. The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.',). Skipping.
手作業でDNSサーバーにTXTレコードを追加して認証した手順を自動化できない限り、renewコマンドで更新は不可能ということのようです。
python-certbot-dnsプラグインが公開されているDNSか、APIが公開されているDNSでスクリプトを組むしかなく、Cloudflare DNSやAmazon Route53やsakura DNSなどで自動化している方もいるみたいですが、私には理解できないレベルの内容になります。
元に戻す
ということで、90日ごとに手作業で更新するのは面倒すぎるので、元の自動更新され続けている証明書に戻しました。
ワイルドカード対応にこだわらなくても、実在するサブドメインを全部指定して発行した証明書で何も困らないわけです。無料証明書なので、あとからいくつでも追加サブドメインで発行できますし。
そのうち、ワイルドカード証明書がもっと簡単に自動更新できるようになるのを待つことにしました。
証明書を削除するには
テストで発行したワイルドカード証明書は、残しておくと毎回Cronからエラーメッセージが届きそうなので削除することにしました。
# certbot delete
で発行済みの証明書一覧が出るので、今回の場合はdef-4.com-0001 の証明書名になっている番号を入力してサーバーから削除できました。90日の期限が近くなると延長のお知らせメールが来るかどうかわかりませんが、それが来ても無視していれば完全に消滅でしょうか。
(参考サイト)
https://letsencrypt.jp/docs/acme-v2-wildcards.html
https://www.debian.or.jp/using/other-release.html
https://tracker.debian.org/pkg/python-certbot