SSL証明書はSAN拡張で「wwwあり/なし」を1つの証明書を取得できる

今更ながらSSL証明書を取得するときにwwwあり・なしを1つの証明書(ワイルドカード証明書ではない)で取得できることを知った時の覚書。

環境: CentOS Stream 10,  nginx 1.28.0, certbot 4.2.0


1. SAN証明書(Subject Alternative Name certificate)とは?

昔はマルチドメインと呼んでいたSSL証明書の機能。

昔のSSL証明書は「1つのドメインにつき1つのコモンネーム」が基本だったが、現在は1枚の証明書で複数のドメインをカバーするのが一般的。

Google Chrome バージョン58(2017年3月リリース)では、「コモンネーム(CN)を無視し、SANの記述のみを評価する」という仕様変更を行った。
これにより、現在のすべてのSSL証明書はSANに対応していることが必須となった。
2017年までは各ブラウザが「SANがなければコモンネーム(CN) を見る」という順序で確認していた。
参考: Public key certificate - Wikipedia

Let's Encryptはサービス開始当初(2015年)から対応。


SSL証明書の規格(X.509 v3)自体が1999年頃に策定されており、OSやブラウザはそれに追随してかなり早い段階で対応していた。
つまり筆者がSANを知らなかったのは単なる勉強不足。

昔はマルチドメイン証明書は高額な追加費用で買っていた。


2. certbotの疎通確認(HTTP認証)

例えば「hoge.com」と「www.hoge.com」のSSL証明書を取得する場合、certbotは次のアドレスへアクセスし、両方のドメインが載った証明書を発行する。

  • http://hoge.com/.well-known/acme-challenge/トークンA
  • http://www.hoge.com/.well-known/acme-challenge/トークンB


3. 既存のSSL証明書を切り替える

ドメインのDNS設定で、wwwが名前解決できるか確認しておく。
Nginxの設定でserver_nameを
server_name  .hoge.com;
のように変更しておく。

Windowsからアクセス確認。
PS:> curl -I https://hoge.com/
PS:> curl -I https://www.hoge.com/

証明書取得。
# certbot certonly --webroot -w /home/httpd/hoge/wordpress -d hoge.com -d www.hoge.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
You have an existing certificate that contains a portion of the domains you
requested (ref: /etc/letsencrypt/renewal/hoge.com.conf)

It contains these names: hoge.com

You requested these names for the new certificate: hoge.com,
www.hoge.com.

Do you want to expand and replace this existing certificate with the new
certificate?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(E)xpand/(C)ancel:

既存の証明書を拡張して上書きしますか?
と聞かれるのでExpandを選択。

Nginx再読み込み。
# systemctl reload nginx

Windowsからアクセス確認。
PS:> curl -I https://hoge.com/
PS:> curl -I https://www.hoge.com/

wwwあり・なしの証明書か確認するコマンド。
「Domains」項目に取得したドメインが併記されている。
# certbot certificates

OpenSSLコマンドで確認する場合。
# openssl x509 -in /etc/letsencrypt/live/hoge.com/fullchain.pem -noout -text | grep -A 1 "Subject Alternative Name"

ブラウザではFirefoxでアドレスバーのカギマークをクリックして、「証明書を表示」を選択すると「主体者代替名」に表示される。
(Google Chromeではシークレットモードで開いても、証明書ビューアに複数ドメインが記載されてなかった。発行日は更新されていたから証明書ビューアの問題だと思う)


▼ 関連記事