Saltar al contenido
ecdsa.com
Java (JSSE HostnameChecker)Java

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

Cómo solucionarlo

  1. 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. 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. 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

Explorar toda la base de datos de errores de firma