Pular para o conteúdo
ecdsa.com
Java (JSSE HostnameChecker)Java

Mensagem de erro

No subject alternative DNS name matching api.example.com found.

Também aparece 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.

O host é o da sua URL. Os JDKs 21 e 25 acrescentam o alerta TLS como prefixo: “(certificate_unknown) No subject alternative DNS name matching … found.”. Certificados sem nenhuma extensão SAN, ou URLs com endereço IP, produzem em vez disso “No subject alternative names present” e “No subject alternative names matching IP address … found”.

Java (JSSE HostnameChecker) — java.security.cert.CertificateException inside SSLHandshakeException

O que significa

A cadeia de certificados é confiável, mas a verificação de nome de host do Java (identificação do endpoint HTTPS) não encontrou na extensão Subject Alternative Name do certificado nenhuma entrada DNS que corresponda ao host da URL. O Java cita o host que ele foi instruído a acessar. Como o certificado tem uma extensão SAN, o Common Name dele não é considerado.

Por que acontece

Como corrigir

  1. 1.

    Listar os nomes do certificado

    O openssl ou o keytool -printcert -sslserver mostra as entradas SubjectAlternativeName para você comparar com a 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.

    Reemitir o certificado com os nomes que faltam

    Solicite todos os nomes DNS que os clientes usam; a opção -ext SAN=dns:…,dns:… do keytool os adiciona ao 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 com um nome que conste do certificado

    Mantenha a verificação do nome de host ativada e, em vez disso, mude a URL (e a resolução de nomes); um HostnameVerifier que aceita tudo elimina a proteção que é a razão de ser do 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();

Erros relacionados

Ver toda a base de erros de assinatura