Message d’erreur
No subject alternative names present
Également affiché sous la forme
- java.security.cert.CertificateException: No subject alternative names present
À partir du JDK 21, le texte de l’exception est précédé de « (certificate_unknown) ». Pour les noms d’hôte DNS, un certificat sans SAN peut encore correspondre par son nom commun (CN) dans Java ; d’autres clients (Go, Chrome) rejettent purement et simplement ces certificats.
Java (JSSE HostnameChecker) — certificate without a SAN extension, URL host is an IP address
Ce que cela signifie
Le certificat du serveur ne possède aucune extension Subject Alternative Name, et le client s’est connecté par adresse IP. Pour une adresse IP, Java exige une entrée SAN de type IP et ne se rabat jamais sur le nom commun (CN) : sans extension SAN, il n’y a donc rien à comparer. C’est le résultat typique des certificats générés par d’anciens scripts avec un simple CN.
Pourquoi cela se produit
Le certificat a été créé sans subjectAltName
fréquenteopenssl req -x509 sans -addext subjectAltName, d’anciennes commandes keytool sans -ext SAN, ou des certificats générés par un équipement.
L’adresse IP a été placée dans le nom commun (CN)
fréquenteCN=10.0.0.5 semble correct, mais est ignoré pour la correspondance des adresses IP ; seule une entrée SAN de type IP compte.
Outils ou modèles PKI hérités
occasionnelleLes modèles d’AC internes antérieurs à l’exigence du SAN continuent d’émettre des certificats qui ne contiennent qu’un CN.
Comment corriger l’erreur
- 1.
Confirmer l’absence de l’extension SAN
Affichez le sujet et subjectAltName ; si aucun SAN n’apparaît, le certificat doit être réémis.
bash openssl x509 -in server.pem -noout -subject -ext subjectAltName # "No extensions in certificate" / no SAN output -> the certificate must be reissued - 2.
Réémettre avec subjectAltName
Ajoutez des entrées DNS et, si nécessaire, des entrées IP ; ne gardez le CN que pour l’affichage.
bash openssl req -new -key server.key -out server.csr -subj "/CN=api.example.com" \ -addext "subjectAltName=DNS:api.example.com,IP:10.0.0.5" # keytool (Java keystores) keytool -genkeypair -alias server -keyalg EC -groupname secp256r1 -dname "CN=api.example.com" \ -ext "SAN=dns:api.example.com,ip:10.0.0.5" -keystore server.p12 -storepass changeit