18
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-15

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

参考にしたサイト

18
19
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?