Message d’erreur
javax.net.ssl.SSLException: Unsupported or unrecognized SSL message
Également affiché sous la forme
- Unsupported or unrecognized SSL message
Le JDK 25 affiche le même texte côté client et sur un serveur JSSE qui reçoit du HTTP en clair (les deux cas ont été vérifiés). Lorsque le pair n’envoie rien et ferme la connexion, Java signale plutôt « Remote host terminated the handshake ».
Java (JSSE) — the peer's reply is not a TLS record
Ce que cela signifie
JSSE attendait un enregistrement TLS et a reçu des octets qu’il ne peut pas analyser comme tel, le plus souvent le texte d’une réponse HTTP envoyée par un serveur HTTP en clair. Côté client, https:// a été utilisé vers un port qui ne parle pas TLS ; côté serveur (un écouteur TLS de Tomcat ou de Netty), un client a envoyé du HTTP en clair sur le port TLS. Le certificat n’a rien à voir ici.
Pourquoi cela se produit
https:// vers un port qui sert du HTTP en clair
fréquenteLes services internes placés derrière un proxy qui assure la terminaison TLS, les ports actuator ou de métriques et les serveurs de développement locaux parlent généralement HTTP en clair.
Le proxy est en HTTP en clair, mais configuré en TLS
fréquenteLes proxys sortants acceptent généralement du HTTP en clair et font passer le HTTPS par un tunnel CONNECT ; configurer TLS vers le proxy lui-même produit cette erreur.
TLS implicite vers un port STARTTLS
occasionnelleSMTP sur 587/25 (avec mail.smtp.ssl.enable=true sur ces ports), LDAP sur 389 avec ldaps://, ou des bases de données qui attendent un passage à TLS au sein de la connexion.
Journal du serveur : un client a envoyé du HTTP en clair sur le port TLS
occasionnelleDes contrôles d’intégrité ou des utilisateurs qui appellent http://host:8443 font consigner ce message par le connecteur TLS à chaque requête.
Comment corriger l’erreur
- 1.
Vérifier ce que parle le port
Si le port répond en HTTP en clair, utilisez http:// ou le vrai port TLS.
bash curl -si http://api.example.com:8080/ | head -1 # an HTTP status line -> not TLS openssl s_client -connect api.example.com:8443 -brief </dev/null - 2.
Clients de messagerie et d’annuaire : accorder le mode TLS et le port
Utilisez STARTTLS sur le port de soumission (587) et le TLS implicite uniquement sur le 465 (ou ldaps:// sur le 636).
text # Mail (Jakarta Mail): STARTTLS on 587, implicit TLS on 465 mail.smtp.port=587 mail.smtp.starttls.enable=true mail.smtp.starttls.required=true # (mail.smtp.ssl.enable=true belongs to port 465 only) - 3.
Propriétaires de serveurs : séparer les ports HTTP et HTTPS
Faites pointer les clients et les contrôles d’intégrité vers https://, ou exposez un connecteur HTTP en clair qui redirige vers le port TLS.
text # Spring Boot server logging this for incoming requests: plain HTTP sent to the TLS port. # Use https:// on server.port, or add a separate HTTP connector that redirects to HTTPS.