ドキッ！落とし穴だらけの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


## 参考にしたサイト  
  * [certbot github https://github.com/certbot/certbot](https://github.com/certbot/certbot)
  
  * [Let's Encrypt 総合ポータル https://letsencrypt.jp/command/](https://letsencrypt.jp/command/)
  
  * [CertbotでDNSによる認証(DNS-01)で無料のSSL/TLS証明書を取得する http://blog.jicoman.info/2017/04/certbot_dns_01/](http://blog.jicoman.info/2017/04/certbot_dns_01/)