ドキッ!落とし穴だらけのcertbotで無料のワイルドカード証明書取得(Let's Encrypt)

Let's encryptがacme v2に対応したのでワイルドカード証明書が取れるようになりました。
リリース後すぐ試してなんだできないじゃんと思っていたらcertbotの--serverオプションでACMEv2用のエンドポイント指定が必要だったというオチ。
しかしいざ取得してみるとなかなか制限(落とし穴)が多かったのでポロリします。

落とし穴

  • サーバのroot権限持っていないとダメ(まぁ当然ですが)
  • ドメインのTXTレコードが書き換えられないとダメ(誰が管理してるの?)
  • Webサーバをダウンさせられないとダメ(運用中だとダウンタイムが発生しちゃうよ、別マシンで作成して移動は可能だよ)
  • 自動更新は基本できないので毎回(90日期限前)忘れずに手作業で更新できないとダメ(普通にrenewでできるよって人もいるけど本当かい?って感じ、懐疑的)
  • サブドメインなしのyourdomain.comと*.yourdomain.comの両対応はおそらく無理だよ(サブドメなしはssl非対応にしてwww転送とかしないとだよ) 可能でした!

自動更新できないというのは、ワイルドカード証明書の取得には
DNS-01チャレンジタイプ方式による認証フローが必須で取得・更新のたびに指定されるTXTレコードが違う(おそらく)から手動じゃないとキツくね?という話で
スクリプトでTXTレコードを書き換えられるDNSを使えればいけるはず(さくらのクラウドとかRoute53とか)。
certbot-external-authのオプションにスクリプトを指定して更新させるようだ。
無理なら大抵の場合はワイルドカードを使わずhttp-01形式でコツコツSANsで対応するのが無難。

全然オッケー!なら以下手順で取れたよ!

1.certbot開始

certbotは本体だけあれば良いのでyumやapt-getせずにファイルだけ拾ってくる方がエコ。Certbot v0.22.0~ ACME v2サポート対応。

# rootで作業
$ sudo wget https://raw.githubusercontent.com/certbot/certbot/master/certbot-auto
$ sudo chmod +x ./certbot-auto

$ sudo ./certbot-auto certonly \
  --manual \
  --domain [Domain] --domain [*.Domain] \
  --email [Your Email] \
  --agree-tos \
  --manual-public-ip-logging-ok \
  --preferred-challenges dns-01 \
  --server https://acme-v02.api.letsencrypt.org/directory

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for [Domain]

-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.[Domain] with the following value:

*** [設定するTXTレコード] ***

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue

ここでこのターミナルがネットワークの切断等で切れないよう注意しつつ次の作業へ。
あとで戻ります。
(acme.shではDNSレコードの確認前に一度プロセスの切り替えがあって安心ですがcertbotはここがkeep aliveなので鬼門です。)

ドメインなしとワイルドワードドメインで実行した場合はそれぞれ2回のDNSチャレンジを行いますが、
設定するレコードは同じで_acme-challenge.[Domain]でした。
この場合はTXTレコードを2レコード設定する事でどちらかに対応するレコードが含まれて入れば良いという感じでした。
深読みしてSPFレコードの様に1レコードに変な設定の仕方をする必要はありません、2レコード設定すればOKでした。

2.DNS設定

よしなにTXTレコードを設定。
やり直しになると設定するレコードも変わるのでttlは失敗した場合を想定して短くしておいた方が良いでしょう。
もしタイミングがシビアな作業になるのであれば事前に_acme-challenge.[Domain]のTXTレコードを短いttlで作成しておくのも手ですね。
ちなみにイントラ内のサーバーで独自にnamedのようなネームサーバ立てている場合でも、acme-v02のサーバ側からDNS引いているっぽくリモートから指定のTXTレコードが引けないといけないようだった(うちの環境ではローカルDNSとお名前.comに別のTXTを設定していたらお名前.comの方が取られてた)。
だとするとローカルネットワーク専用のドメインには対応できない?

3.DNSレコードの確認

更に別ターミナルを起動しDNS浸透まで待機します。
手元ではOKでも十分時間を置いた方が安全です。

$ nslookup -q=txt _acme-challenge.[Domain]
# もしくは
$ dig -t TXT _acme-challenge.[Domain]

ここで失敗するとやり直しなので要注意です。
僕はお名前のDNS設定変更メールを何通も受信する事になりました。

4.証明書発行

TXTレコードが浸透した事を確認したらメインのターミナルに戻ってENTERを力強く叩きます。

Press Enter to Continue
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/[Domain]/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/[Domain]/privkey.pem
   Your cert will expire on 2018-06-12. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

という事で
/etc/letsencrypt/live/
に証明書が設置されているのでご自由にお使いください。
chain.pem
cert.pem
を使うか、両方が合体した
fullchain.pem
を使うかはWebサーバとかバージョンとかで変わるのでここもよしなにですね。

出会ったトラブル

一度発行失敗したにもかかわらずLet's encryptによりhttpd.conf内にsslの設定ファイルが設置されてしまった(なぜ!)。
しかし既に別のSSL証明書を使用していた事もあり他のconfにLISTEN 443が記述済みだったためapacheが起動しなくなりました。

httpd[3952]: (98)Address already in use: AH00072: make_sock: could not bind to address [::]:443

参考にしたサイト

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.