それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Certbot で異なる「別ドメイン」の証明書を1枚にまとめる。

Let'sEncryptの証明書は別々のドメインを集約できた。

Let'sEncryptのDNS更新クライアントを作っていた。仕様をアレコレと確認し、色々な組み合わせで証明書を発行したのですが。

「もしかして、異なるベース・ドメインでも認証通るんじゃね?」 と思いついた。1分ほど考えた、SAN値の問題なので証明書的には発行できるはず。Let'sEncryptが対応可能かに依存するだろう。Let'sEncryptのドキュメントを見た。ドメインのリストに言及はない。レート制限くらいである。実験したほうが早そうだ。

早速試しててみた。すると、ベースになるドメイン名が、異なっていても、Let'sEncryptなら1枚の証明書として発行してくれた。まじか。

作った証明書をWindowsで表示した例

xxx.com と xxx.biz が両方SubjectAlternativeNameにあるのがわかるでしょうか。

試してみる。

次のような流れで、試してみた。

サンプルドメイン

次の2つのドメインで発行を試みる。

multi-sample.example.com
multi.example.biz.tld

DNS-01 を使う

今回は、処理が簡単なDNS-01を使う。

Cloudflare 側で、すべてのZoneのDNSレコードを操作できるAPIトークンを作った。

このトークンをcloudflare-api.cfg に保存してスタート。

発行コマンドを実行

/usr/bin/certbot certonly \
 --cert-name sample-multiple \
 --dns-cloudflare \
 --dns-cloudflare-credentials cloudflare-api.cfg \
  -d "multi-sample.example.com" \
  -d "multi.example.biz.tld"

実行が始まる。

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator dns-cloudflare, Installer None
Requesting a certificate for multi.example.biz.tld and multi-sample.example.com
Performing the following challenges:
dns-01 challenge for multi.example.biz.tld
dns-01 challenge for multi-sample.example.com
Waiting 10 seconds for DNS changes to propagate
Waiting for verification...
Cleaning up challenges

発行された

  Certificate Name: sample-multiple
    Serial Number: 937d530297d53029xxx
    Key Type: RSA
    Domains: multi.example.biz.tld multi-sample.example.com
    Expiry Date: 2023-05-12 15:11:37+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/sample-multiple/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/sample-multiple/privkey.pem

証明書のSAN値を確認する

SAN値でも、ちゃんと表示されている。

sudo openssl x509 -noout -ext subjectAltName -in /etc/letsencrypt/live/sample-multiple/fullchain.pem
X509v3 Subject Alternative Name:
    DNS:multi-sample.example.com, DNS:multi.example.biz.tld

勝手な思い込み=「証明書はドメインごと」

SANを使えば、別々のドメインでも発行できるのは、当たり前なんだけど。

SSL証明書を購入するときってドメインごとにに買っていたので、1枚にまとめるなんて言う発想はまったくなかった。ドメインが違うと証明書と鍵を別々に発行する。というよくある手順。これって単なる思い込み。なんですよね。OpenSSLのX509を考えれば、出来ても当然ですわ。

Let'sEncryptは複数ドメイン証明書はサブドメインだけでなく、メイン・ドメインを複数発行にも対応していました。

メリット

管理がとても簡単になる。枚数が増えると負荷が増える。枚数が減れば、管理の負荷も下がる。

セキュリティ的なこと

別々のドメイン名の証明書を1枚にまとめるのは、セキュリティ面では、推奨されない。という意見もある。それを言い出すと、ワイルドカードな証明書すら使えない。なので、ドメインごとに1枚ずつ発行する必要がある。枚数が増えると、管理コストが嵩み、逆にヒューマンエラーの危険性を招くこともある。「〇〇をすれば完全OKというセキュリティなど存在しない。」なのがセキュリティの原則だ。セキュリティはいつも落とし所が違う。管理コストなど勘案して妥当なところを使うのがセキュリティだ。

個人的な意見ですが、管理を平易化しミスを減らし危険行為を未然に防ぐという視点から別々のドメインを1枚にまとめるのはアリだと思います。

たとえば、これはGoogleとか言う大手企業のSSL証明書です。

Google さんの証明書を見てみると、SAN値に大量のドメイン名が入っています。ドメイン所有の明示しているのがわかる。

むかし、ドメイン名とSSLは管理の関係で1枚にしろとセキュリティの偉い人に言われた記憶があるんだけど。いまは、もう証明書なんて1枚で済ませるんですよ。

そして、Let'sEncryptでも対応できるのが素晴らしいと思った次第です。