Сообщение об ошибке
javax.net.ssl.SSLException: Unsupported or unrecognized SSL message
Также выводится как
- Unsupported or unrecognized SSL message
JDK 25 выводит один и тот же текст на стороне клиента и на сервере JSSE, который получает обычный HTTP (оба случая проверены). Если другая сторона ничего не отправляет и закрывает соединение, Java вместо этого сообщает «Remote host terminated the handshake».
Java (JSSE) — the peer's reply is not a TLS record
Что это означает
Вместо записи TLS в JSSE пришли байты, которые нельзя разобрать как запись TLS: чаще всего это текст HTTP-ответа от сервера, работающего по обычному HTTP. На стороне клиента это значит, что https:// использован для порта, который не работает по TLS; на стороне сервера (Tomcat или Netty, принимающие TLS) — что клиент отправил обычный HTTP на TLS-порт. Сертификат здесь ни при чём.
Почему это происходит
https:// на порт с обычным HTTP
частоВнутренние сервисы за прокси, терминирующим TLS, порты actuator или метрик и локальные серверы разработки, как правило, работают по обычному HTTP.
Прокси работает по обычному HTTP, но настроен как TLS-прокси
частоПрямые прокси обычно принимают обычный HTTP и туннелируют HTTPS через CONNECT; если настроить TLS-соединение с самим прокси, возникает эта ошибка.
Неявный TLS на порту STARTTLS
иногдаSMTP на портах 587/25 (с mail.smtp.ssl.enable=true), LDAP на 389 с ldaps:// или базы данных, которые ожидают перехода на TLS внутри уже открытого соединения.
Журнал сервера: клиент отправил обычный HTTP на TLS-порт
иногдаПроверки состояния или пользователи, обращающиеся к http://host:8443, заставляют TLS-коннектор записывать эту ошибку в журнал при каждом запросе.
Как исправить
- 1.
Проверьте, по какому протоколу работает порт
Если порт отвечает по обычному HTTP, используйте http:// или настоящий 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.
Почтовые клиенты и клиенты каталогов: согласуйте режим TLS и порт
Используйте STARTTLS на порту отправки (587), а неявный TLS — только на 465 (или ldaps:// на 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.
Владельцам серверов: разделите порты HTTP и HTTPS
Направьте клиентов и проверки состояния на https:// или откройте отдельный коннектор с обычным HTTP, который перенаправляет на 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.