Java (JSSE HostnameChecker)Java
エラーメッセージ
No subject alternative names matching IP address 127.0.0.1 found
別の表記
- java.security.cert.CertificateException: No subject alternative names matching IP address 127.0.0.1 found
アドレスは URL に含まれていたものです。JDK 21 以降では、例外のテキストの先頭に「(certificate_unknown) 」が付きます。DNS のホスト名の場合、メッセージは「No subject alternative DNS name matching <host> found.」です。
Java (JSSE HostnameChecker) — URL host is an IP address that is not an IP SAN of the certificate
このエラーの意味
URL のホストが IP アドレスですが、証明書のサブジェクト代替名拡張には、そのアドレスと一致する IP アドレスのエントリがありません。Java は(RFC 6125 に従い)IP アドレスを IP SAN エントリとだけ比較します。DNS 名やコモンネームがアドレスと一致することはありません。
発生する理由
クライアントが IP アドレスで接続している
よくあるホスト名の代わりに IP アドレスを記録している設定ファイル、JDBC URL、サービスレジストリが該当します。
Pod やノードのアドレスに向けたクラスター内部の通信
よくある証明書にはサービス名が記載されているのに、IP アドレス(Pod、ノード、クラウドのインスタンス)を返すサービスディスカバリが該当します。
IP アドレスでのアクセスを想定した証明書に IP SAN がない
ときどきIP アドレスをコモンネームに入れても機能しません。subjectAltName の IP エントリとして記載しなければなりません。
修正方法
- 1.
証明書に記載された DNS 名で接続する
ホスト名を使い、それを必要なアドレスに名前解決してください。そうすれば、ホスト名の検証は成功します。
bash # Use the DNS name from the certificate; map it to the IP where needed echo "10.0.0.5 api.example.com" | sudo tee -a /etc/hosts curl -sI https://api.example.com/ - 2.
IP SAN を含めて証明書を発行する
クライアントがアドレスを使わなければならない場合は、IP エントリとして追加してください(パブリック CA がこうした証明書を発行することはまれですが、プライベート CA なら発行できます)。
bash # Or issue the certificate with the IP address as an IP SAN entry openssl req -new -key server.key -out server.csr -subj "/CN=api.example.com" \ -addext "subjectAltName=DNS:api.example.com,IP:10.0.0.5" keytool -certreq -alias server -keystore server.p12 -ext "SAN=dns:api.example.com,ip:10.0.0.5" -file server.csr