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 yourequested (ref: /etc/letsencrypt/renewal/hoge.com.conf)It contains these names: hoge.comYou requested these names for the new certificate: hoge.com,www.hoge.com.Do you want to expand and replace this existing certificate with the newcertificate?- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(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ではシークレットモードで開いても、証明書ビューアに複数ドメインが記載されてなかった。発行日は更新されていたから証明書ビューアの問題だと思う)