Fehlermeldung
javax.net.ssl.SSLException: Unsupported or unrecognized SSL message
Auch ausgegeben als
- Unsupported or unrecognized SSL message
JDK 25 gibt denselben Text auf Client-Seite und auf einem JSSE-Server aus, der reines HTTP empfängt (beides geprüft). Sendet die Gegenseite nichts und schließt die Verbindung, meldet Java stattdessen „Remote host terminated the handshake“.
Java (JSSE) — the peer's reply is not a TLS record
Was der Fehler bedeutet
JSSE hat einen TLS-Record erwartet und Bytes erhalten, die es nicht als solchen parsen kann, meist den Text einer HTTP-Antwort von einem reinen HTTP-Server. Auf Client-Seite wurde https:// gegen einen Port verwendet, der kein TLS spricht; auf Server-Seite (einem TLS-Listener von Tomcat oder Netty) hat ein Client reines HTTP an den TLS-Port gesendet. Das Zertifikat spielt hier keine Rolle.
Warum der Fehler auftritt
https:// auf einen Port mit reinem HTTP
häufigInterne Dienste hinter einem Proxy, der TLS terminiert, Actuator- oder Metrics-Ports und lokale Entwicklungsserver sprechen meist reines HTTP.
Der Proxy spricht reines HTTP, ist aber als TLS konfiguriert
häufigForward-Proxys nehmen typischerweise reines HTTP an und tunneln HTTPS per CONNECT; eine TLS-Verbindung zum Proxy selbst führt zu diesem Fehler.
Implizites TLS gegen einen STARTTLS-Port
gelegentlichSMTP auf 587/25 (dort mit mail.smtp.ssl.enable=true), LDAP auf 389 mit ldaps:// oder Datenbanken, die ein In-Band-Upgrade erwarten.
Serverlog: Ein Client hat reines HTTP an den TLS-Port gesendet
gelegentlichRufen Health Checks oder Nutzer http://host:8443 auf, protokolliert der TLS-Connector das bei jeder Anfrage.
So behebst du den Fehler
- 1.
Prüfen, was der Port spricht
Antwortet der Port mit reinem HTTP, verwende http:// oder den richtigen TLS-Port.
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.
Mail- und Verzeichnis-Clients: TLS-Modus und Port aufeinander abstimmen
Verwende STARTTLS auf dem Submission-Port (587) und implizites TLS nur auf 465 (oder ldaps:// auf 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.
Eigener Server: HTTP- und HTTPS-Ports trennen
Richte Clients und Health Checks auf https:// aus oder stelle einen reinen HTTP-Connector bereit, der auf den TLS-Port weiterleitet.
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.