Message d’erreur
No subject alternative DNS name matching api.example.com found.
Également affiché sous la forme
- 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.
L’hôte est celui de votre URL. Les JDK 21 et 25 font précéder le message de l’alerte TLS : « (certificate_unknown) No subject alternative DNS name matching … found. » Les certificats dépourvus de toute extension SAN, ou les URL contenant une adresse IP, produisent à la place « No subject alternative names present » et « No subject alternative names matching IP address … found ».
Java (JSSE HostnameChecker) — java.security.cert.CertificateException inside SSLHandshakeException
Ce que cela signifie
La chaîne de certificats est approuvée, mais la vérification du nom d’hôte de Java (identification du point de terminaison HTTPS) n’a trouvé, dans l’extension Subject Alternative Name du certificat, aucune entrée DNS correspondant à l’hôte de l’URL. Java cite l’hôte qu’on lui a demandé de joindre. Comme le certificat possède une extension SAN, son nom commun (CN) n’est pas pris en compte.
Pourquoi cela se produit
Le certificat ne couvre pas ce nom d’hôte
fréquenteLe certificat a été émis pour d’autres noms (www., le domaine nu, un ancien nom de service) ; un wildcard ne couvre qu’un seul niveau de sous-domaine.
Le client utilise un alias interne ou un nom de service
fréquenteLes noms de service Kubernetes, les alias docker-compose et les noms d’hôte des répartiteurs de charge mènent au bon serveur, mais ne figurent pas dans un certificat émis pour le nom public.
Le serveur a renvoyé le certificat d’un autre site
occasionnelleSur les points de terminaison partagés, le certificat dépend du SNI ; un nom non configuré reçoit le certificat par défaut.
Comment corriger l’erreur
- 1.
Lister les noms du certificat
openssl ou keytool -printcert -sslserver affiche les entrées SubjectAlternativeName à comparer avec l’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.
Réémettre le certificat avec les noms manquants
Demandez tous les noms DNS qu’utilisent les clients ; l’option -ext SAN=dns:…,dns:… de keytool les ajoute à 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.
Se connecter avec un nom présent dans le certificat
Laissez la vérification du nom d’hôte activée et modifiez plutôt l’URL (et la résolution de noms) ; un HostnameVerifier qui accepte tout supprime la protection qui fait la raison d’être 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();
Erreurs associées
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)