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
O certificado não cobre este nome de host
comumO certificado foi emitido para outros nomes (www., o domínio apex, um nome de serviço antigo); um curinga cobre só um nível do nome.
O cliente usa um alias interno ou um nome de serviço
comumNomes de serviço do Kubernetes, aliases do docker-compose e nomes de host de balanceadores de carga chegam ao servidor certo, mas não constam de um certificado emitido para o nome público.
O servidor retornou o certificado de outro site
ocasionalEm endpoints compartilhados, o certificado depende do SNI; um nome não configurado recebe o certificado padrão.
Como corrigir
- 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.
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.
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
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)