エラーメッセージ
The certificate's owner does not match hostname 'api.example.com'
別の表記
- ERROR: no certificate subject alternative name matches
GnuTLS でビルドされた wget はこの行を出力します。OpenSSL でビルドされた wget は「ERROR: no certificate subject alternative name matches」と出力し、次の行に「requested host name '<host>'.」が続きます。表示されるホストは、URL に指定したものです。
このエラーの意味
証明書の検証自体は成功しましたが、証明書が URL のホストとは別の名前に対して発行されているため、wget は処理を中止します。ホストは、証明書のサブジェクト代替名拡張に含まれる DNS 名と比較されます。現在の CA はすべて、証明書がカバーする名前をこの拡張に記載しています。wget は終了ステータス 5 で終了します。
発生する理由
証明書がこの名前をカバーしていない
よくあるwww.example.com の証明書は、example.com、api.example.com、新しいサブドメインのいずれもカバーしません。名前はそれぞれ記載されている必要があり、ワイルドカードがカバーするのは 1 つのラベルだけです。
URL に IP アドレスまたは内部のエイリアスを使っている
よくあるhttps://10.0.0.5/ や、コンテナーまたはホストのエイリアスからダウンロードすると、サーバーには到達しますが、証明書に記載されていない名前を要求することになります。
サーバーが別のサイトの証明書を送信した
ときどき共有ホスティングや Ingress コントローラーでは、専用の server ブロックがない名前にはデフォルトの証明書が返されます。
修正方法
- 1.
証明書がカバーする名前を一覧表示する
subjectAltName のエントリを URL のホストと比較してください。
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -ext subjectAltName - 2.
不足している名前を含めて証明書を再発行する
クライアントが使うすべてのホスト名を証明書のリクエストに追加し、その後デプロイしてリロードしてください。
bash sudo certbot certonly --nginx -d example.com -d www.example.com -d api.example.com - 3.
証明書に記載されている名前を使う
記載されている名前でサーバーにアクセスできる場合は、IP アドレスやエイリアスの代わりにその名前を URL に使ってください。
bash # Download through a name the certificate lists, not an IP or alias wget https://www.example.com/file.tar.gz
関連するエラー
curl: (60) SSL: no alternative certificate subject name matches target hostname…curl (OpenSSL backend)fatal: unable to access 'https://git.example.com/team/app.git/': SSL: certifica…git over HTTPS with libcurl-gnutls (Debian, Ubuntu)x509: certificate is valid for example.com, not api.example.comGo crypto/x509