Mensaje de error
No subject alternative DNS name matching api.example.com found.
También se muestra como
- javax.net.ssl.SSLHandshakeException: (certificate_unknown) No subject alternative DNS name matching api.example.com found.
- java.security.cert.CertificateException: No subject alternative DNS name matching api.example.com found.
El host es el de tu URL. JDK 21 y 25 anteponen la alerta TLS: «(certificate_unknown) No subject alternative DNS name matching … found.». Los certificados sin ninguna extensión SAN, o las URL con una dirección IP, producen en su lugar «No subject alternative names present» y «No subject alternative names matching IP address … found».
Java (JSSE HostnameChecker) — java.security.cert.CertificateException inside SSLHandshakeException
Qué significa
La cadena de certificados es de confianza, pero la comprobación del nombre de host de Java (identificación del endpoint HTTPS) no encontró en la extensión de nombre alternativo del sujeto del certificado ninguna entrada DNS que coincida con el host de la URL. Java cita el host al que se le pidió conectar. Como el certificado tiene una extensión SAN, su nombre común no se tiene en cuenta.
Por qué ocurre
El certificado no cubre este nombre de host
frecuenteEl certificado se emitió para otros nombres (www., el dominio raíz, un nombre de servicio antiguo); un comodín solo cubre un nivel.
El cliente usa un alias interno o un nombre de servicio
frecuenteLos nombres de servicio de Kubernetes, los alias de docker-compose y los nombres de host de los balanceadores de carga llegan al servidor correcto, pero no figuran en un certificado emitido para el nombre público.
El servidor devolvió el certificado de otro sitio
ocasionalEn los endpoints compartidos, el certificado depende del SNI; un nombre no configurado recibe el certificado predeterminado.
Cómo solucionarlo
- 1.
Listar los nombres del certificado
openssl o keytool -printcert -sslserver muestran las entradas SubjectAlternativeName para compararlas con la URL.
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -ext subjectAltName # or with Java's own tool keytool -printcert -sslserver api.example.com:443 | grep -A3 SubjectAlternativeName - 2.
Volver a emitir el certificado con los nombres que faltan
Solicita todos los nombres DNS que usan los clientes; la opción -ext SAN=dns:…,dns:… de keytool los añade a la CSR.
bash # Java keystores: request a certificate with every name in the SAN extension keytool -certreq -alias server -keystore server.p12 -ext "SAN=dns:api.example.com,dns:www.example.com" -file server.csr - 3.
Conectar con un nombre que figure en el certificado
Mantén activada la verificación del nombre de host y cambia en su lugar la URL (y la resolución de nombres); un HostnameVerifier que lo acepta todo elimina la protección que es la razón de ser de TLS.
java // Use the name in the certificate in the URL; resolve it to the address you need // (DNS, /etc/hosts or a custom resolver), instead of connecting by IP or alias. HttpRequest req = HttpRequest.newBuilder(URI.create("https://www.example.com/health")).build();
Errores relacionados
No subject alternative names matching IP address 127.0.0.1 foundJava (JSSE HostnameChecker)No subject alternative names presentJava (JSSE HostnameChecker)x509: certificate is valid for example.com, not api.example.comGo crypto/x509curl: (60) SSL: no alternative certificate subject name matches target hostname…curl (OpenSSL backend)