Mensaje de error
No subject alternative names matching IP address 127.0.0.1 found
También se muestra como
- java.security.cert.CertificateException: No subject alternative names matching IP address 127.0.0.1 found
La dirección es la de tu URL; JDK 21 y posteriores anteponen «(certificate_unknown) » al texto de la excepción. Para nombres de host DNS, el mensaje es «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
Qué significa
El host de la URL es una dirección IP, y la extensión de nombre alternativo del sujeto del certificado no tiene ninguna entrada de dirección IP igual a ella. Java (según el RFC 6125) compara las direcciones IP solo con las entradas SAN de tipo IP; los nombres DNS y el nombre común nunca coinciden con una dirección.
Por qué ocurre
El cliente se conecta por dirección IP
frecuenteArchivos de configuración, URL de JDBC y registros de servicios que guardan direcciones IP en lugar de nombres de host.
Tráfico interno del clúster a direcciones de pods o nodos
frecuenteUn descubrimiento de servicios que reparte direcciones IP (pods, nodos, instancias en la nube) mientras los certificados llevan nombres de servicio.
El certificado estaba pensado para acceder por IP, pero le falta la entrada SAN de tipo IP
ocasionalPoner la dirección IP en el nombre común no funciona; tiene que ser una entrada IP en subjectAltName.
Cómo solucionarlo
- 1.
Conectar con un nombre DNS que figure en el certificado
Usa el nombre de host y haz que se resuelva a la dirección necesaria; así se supera la verificación del nombre de host.
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.
Emitir el certificado con una entrada SAN de tipo IP
Cuando los clientes tengan que usar la dirección, añádela como entrada IP (las CA públicas rara vez emiten estos certificados; las privadas sí pueden).
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