Fehlermeldung
No subject alternative names present
Auch ausgegeben als
- java.security.cert.CertificateException: No subject alternative names present
JDK 21 und neuer stellen dem Text der Exception „(certificate_unknown) “ voran. Bei DNS-Hostnamen kann ein Zertifikat ohne SANs in Java noch über den Common Name passen; andere Clients (Go, Chrome) lehnen solche Zertifikate rundweg ab.
Java (JSSE HostnameChecker) — certificate without a SAN extension, URL host is an IP address
Was der Fehler bedeutet
Das Zertifikat des Servers hat überhaupt keine Erweiterung Subject Alternative Name, und der Client hat sich über eine IP-Adresse verbunden. Bei IP-Adressen verlangt Java einen IP-SAN-Eintrag und greift nie auf den Common Name zurück – ohne SAN-Erweiterung gibt es also nichts zu vergleichen. Das ist das typische Ergebnis von Zertifikaten, die von alten Skripten nur mit einem CN erzeugt wurden.
Warum der Fehler auftritt
Das Zertifikat wurde ohne subjectAltName erstellt
häufigopenssl req -x509 ohne -addext subjectAltName, alte keytool-Befehle ohne -ext SAN oder von Appliances erzeugte Zertifikate.
Die IP-Adresse wurde in den Common Name geschrieben
häufigCN=10.0.0.5 sieht richtig aus, wird beim Abgleich von IP-Adressen aber ignoriert; nur ein IP-SAN-Eintrag zählt.
Veraltete PKI-Tools oder -Vorlagen
gelegentlichInterne CA-Vorlagen, die älter sind als die SAN-Pflicht, stellen weiterhin Zertifikate nur mit CN aus.
So behebst du den Fehler
- 1.
Bestätigen, dass die SAN-Erweiterung fehlt
Gib Subject und subjectAltName aus; erscheint kein SAN in der Ausgabe, muss das Zertifikat neu ausgestellt werden.
bash openssl x509 -in server.pem -noout -subject -ext subjectAltName # "No extensions in certificate" / no SAN output -> the certificate must be reissued - 2.
Mit subjectAltName neu ausstellen
Füge DNS-Einträge und bei Bedarf IP-Einträge hinzu; den CN behältst du nur noch für die Anzeige.
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