Let's Encryptによるワイルドカード証明書 ~簡単なコマンドオプション解説を添えて~


certbotコマンドを実行

certbot certonly \ # 1
--manual \ # 2
--server https://acme-v02.api.letsencrypt.org/directory \ # 3
--preferred-challenges dns \ # 4
-d *.example.com \ # 5
-d example.com \ # 5
-m [email protected] \ # 6
--agree-tos \ # 7
--manual-public-ip-logging-ok # 8

1. certonly

certbotのサブコマンドです。

単に$ certbotで実行すると、デフォルトでサブコマンドrunが実行されます。
runは稼働中のウェブサーバーに対し、証明書の取得・インストールを実行します。

それに対し、certonlyでは証明書の取得だけを実行します。
ウェブサーバーへのインストールは自分でやります。

Let's Encryptの解説記事を見るとよくcertonlyが使われてますが、何故だかはわかっていません。
勝手にウェブサーバーの設定を触られると変になるかもしれないからかな?
夏バテで試す気力もないので、親切な人がいたら教えて下さい。

2. --manual

ドメイン名の認証を手動で行います。
これなしで実行すると、ウェブサーバーの設定から自動でドメインを認識します。多分。
精度が不明なので--manual指定しかやったことないです。

3. --server

証明書のリソースURIを指定します。
デフォルトはhttps://acme-v01.api.letsencrypt.org/directoryです。
今回はワイルドカードに対応している環境であるhttps://acme-v02.api.letsencrypt.org/directoryを指定します。

4. --preferred-challenges

ドメインを使用する権利があることを確認する認証の方式を選択できます。

デフォルトはhttpによる認証です。
ウェブサーバー上に配置した認証用ファイルをHTTP経由で確認できれば認証成功です。

ワイルドカード証明書を使用するには、DNSによる認証を選択する必要があります。
Let's Encryptが発行するトークンをDNSのTXT属性に設定する必要があり、その操作を持ってドメインの使用権があることを確認します。

5. -d

証明書を使用するドメインを指定します。
ワイルドカードの場合、サブドメインありとなしの両方を指定します。

6. -m

アカウント用のメールアドレスを指定します。
Let's Encrypt上で管理されるアカウントに紐づくメールアドレスで、
更新のお知らせなどが届きます。
証明書を使用するドメインのメールアドレスである必要はありません。
普段遣いのメールアドレスを使用して、お知らせを見逃さないようにするのがいいでしょう。

7. --agree-tos

利用規約に自動で同意します。

8. --manual-public-ip-logging-ok

グローバルIPアドレスを認証局でロギングすることを自動で承諾します。

DNSの設定

コマンドを実行すると、以下のメッセージが表示されるので、この画面は一旦そのまま置いておきます。

Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Before continuing, verify the record is deployed.

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxは実際は認証用のトークンなので、
それを_acme-challenge.example.comへの問い合わせで確認できるようTXTレコードを登録します。

_acme-challenge TXT xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

DNSにTXTレコードを登録してもキャッシュなどの影響ですぐに反映はされないので、別のターミナルを開いて、何度か以下のコマンドを叩いて登録したトークンの応答があることを確認します。

$ nslookup -type=TXT _acme-challenge.example.com 8.8.8.8
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
_acme-challenge.example.com        text = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # ←この応答があればOK

Authoritative answers can be found from:

DNSがトークンの応答を返すことを確認したら、Let's Encryptの画面に戻り、Enterを押します。

簡単に確認

失敗した場合は、何故失敗したのかがメッセージに表示されています。
ドメインが悪いのか、DNSの設定が悪いのか、原因は様々だと思いますが、各種トラブルシューティング記事を参照して解決してください。

上手くいくと、なんやかんやメッセージが表示されます。
証明書ファイルの場所が表示されているので、ウェブサーバーにインストールしましょう。

証明書をインストールしたあと、サブドメインで運用しているサービスへアクセスし、
証明書情報を見たときに、ワイルドカード表示がされていたら成功です。

参考