エラーメッセージ
net::ERR_CERT_COMMON_NAME_INVALID
警告ページには「NET::ERR_CERT_COMMON_NAME_INVALID」と表示され、自動化ツールは「net::ERR_CERT_COMMON_NAME_INVALID」と出力します。
Chrome, Edge and other Chromium browsers — the certificate does not cover the host name in the address bar
このエラーの意味
証明書は信頼されており有効期間内ですが、アドレスバーのホスト名がサブジェクト代替名(SAN)に含まれていません。エラー名とは裏腹に、Chrome はコモンネームをまったく使用しません(Chrome 58 以降)。証明書の subjectAltName にホスト名を記載する必要があります。よくあるのは、www とネイキッドドメインの違い、新しいサブドメイン、1 階層深すぎる名前に使われたワイルドカードです。
発生する理由
証明書にこのホストが記載されていない
よくある証明書を再発行しないまま、DNS にサブドメインやエイリアスを追加した場合です。
2 階層にまたがって使われたワイルドカード
よくある*.example.com は shop.example.com をカバーしますが、eu.shop.example.com はカバーしません(再現例の wrong.host.badssl.com と同じ状況です)。
www とネイキッドドメイン
よくあるwww.example.com 用の証明書は example.com をカバーせず、その逆も同様です。両方を記載する必要があります。
名前がコモンネームにしか含まれていない
ときどきsubjectAltName のない証明書(古い社内ツールで作成したもの)は、CN が一致していても Chrome では失敗します。
修正方法
- 1.
SAN のリストとアドレスを比較する
足りない名前が、追加すべき名前です。
bash echo | openssl s_client -connect www.example.com:443 -servername www.example.com 2>/dev/null \ | openssl x509 -noout -ext subjectAltName - 2.
提供するすべての名前を含めて再発行する
ネイキッドドメイン、www、すべてのサブドメイン(または階層ごとのワイルドカード)を含めてください。
bash # Cover the apex and www (and any subdomain you serve) sudo certbot certonly --nginx -d example.com -d www.example.com - 3.
名前ごとにどの証明書が返されるかを確認する
共有サーバーでは、専用のサーバーブロックがない名前に、別のサイトのデフォルト証明書が返されます。
text # nginx: every served name needs a server block with a matching certificate server { listen 443 ssl; server_name example.com www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; }