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

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

Comment corriger l’erreur

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

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