Aller au contenu
ecdsa.com
Java (JSSE HostnameChecker)Java

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

Comment corriger l’erreur

  1. 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. 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

Erreurs associées

Parcourir toute la base de données des erreurs de signature