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