Let's Encriptでサブドメインに対応する証明書の発行

複数のサブドメインに対応する証明書を発行する方法には

  • サブドメインをすべて指定して発行する
  • サブドメインをワイルドカードで指定して発行する

があります。Let’s Encryptでのそれぞれの発行の方法について確認しました。

サブドメインをすべて指定して発行する方法

複数のサブドメインに対応する証明書を発行したい場合に、対象となるサブドメインをすべて指定して発行する方法です。例えばドメインexample.comとそのサブドメインwww.example.comに対応する証明書を発行するコマンドは以下になります。

certbot certonly \
  --domain example.com \
  --domain www.example.com \
  --expand
certonly
証明書の取得のみを行うオプション。サーバの設定ファイルの自動設定は行わない
--expand
--domainで指定したドメインが既に存在している証明書に含まれている場合、既存の証明書のサブジェクト代替名を拡張する
--domain
証明書の取得を申請するドメインを指定。複数指定することが可能。別名`-d`での指定も可能

サブドメインをすべて指定して証明書を発行した場合、その証明書のサブジェクト代名詞には指定したサブドメインすべてが記載されます。この発行方法の場合certbotで自動更新を行うことができます。

サブドメインをワイルドカードで指定して発行する方法

いくつもサブドメインがある場合やサブドメインの追加や削除を頻繁に行う必要がある場合などは、そのすべてのサブドメインを指定するのは大変です。このような場合、ワイルドカード証明書を利用するのが便利です。

サブドメインをワイルドカードで指定して発行した場合は証明書のサブジェクト代名詞には*.example.comのようにワイルドカードでサブドメインが記載されます。

ドメインexample.comとそのサブドメインすべて*.example.comに対応する証明書を発行するコマンドは以下になります。

certbot certonly \
  --manual \
  --manual-public-ip-logging-ok \
  --server https://acme-v02.api.letsencrypt.org/directory \
  --preferred-challenges dns \
  --domain example.com \
  --domain *.example.com
--manual
認証を手動で行う指定
--manual-public-ip-logging-ok
グローバルIPアドレスのロギングを許可する指定
--server
https://acme-v02.api.letsencrypt.org/directoryを指定
--preferred-challenges
認証方式を指定。今回はドメイン認証方式なのでdnsを指定

証明書の発行のための認証はDNS認証のみが利用可能です。上記のコマンドの場合、DNS認証のためにDNSレコードの書き換えを手動で行う必要があります。

そのため通常のcertbotでの自動更新に対応していませんが、幸いなことにDNSのホスティングプロバイダごとにDNS認証を行うプラグインが提供されています。利用しているプロバイダに対応するDNS認証プラグインがあるかはCertbot DNS Pluginsで確認することができます。

お使いのプロバイダに対応するDNS認証プラグインがある場合はそちらのExamplesを参照して証明書の発行を行うのが良いでしょう。対応するDNS認証プラグインがない場合はDNS認証を行う仕組みを独自に作成するか、手動での証明書の更新を定期作業として行うことになります。

まとめ

サブドメインが頻繁に追加または削除される場合はワイルドカード指定のほうが運用の手間が少なく良いと思います。そうでない場合はサブドメインをすべて指定して証明書を発行する方法で十分と思います。

自分の場合はwwwのありとなしの証明書をまとめたかったのでサブドメインをすべて指定する方法で発行することにしました。その他のサブドメインはそもそも別々のリソースなので、それぞれのサブドメインごとに証明書を発行することにしました。