Mensaje de error
javax.net.ssl.SSLException: Unsupported or unrecognized SSL message
También se muestra como
- Unsupported or unrecognized SSL message
JDK 25 imprime el mismo texto en el lado del cliente y en un servidor JSSE que recibe HTTP plano (comprobados ambos casos). Cuando el otro extremo no envía nada y cierra, Java notifica en cambio «Remote host terminated the handshake».
Java (JSSE) — the peer's reply is not a TLS record
Qué significa
JSSE esperaba un registro TLS y recibió bytes que no puede analizar como tal, casi siempre el texto de una respuesta HTTP de un servidor HTTP plano. En el lado del cliente, se usó https:// contra un puerto que no habla TLS; en el lado del servidor (un listener TLS de Tomcat o Netty), un cliente envió HTTP plano al puerto TLS. El certificado no tiene nada que ver aquí.
Por qué ocurre
https:// contra un puerto HTTP plano
frecuenteLos servicios internos detrás de un proxy que termina TLS, los puertos de actuator o de métricas y los servidores de desarrollo locales suelen hablar HTTP plano.
El proxy es HTTP plano, pero está configurado como TLS
frecuenteLos proxies de reenvío suelen aceptar HTTP plano y tunelizar HTTPS con CONNECT; configurar TLS hacia el propio proxy produce este error.
TLS implícito contra un puerto STARTTLS
ocasionalSMTP en el 587/25 (con mail.smtp.ssl.enable=true en esos puertos), LDAP en el 389 con ldaps:// o bases de datos que esperan el paso a TLS dentro del mismo canal.
Registro del servidor: un cliente envió HTTP plano al puerto TLS
ocasionalLas comprobaciones de estado o los usuarios que llaman a http://host:8443 hacen que el conector TLS registre este mensaje en cada solicitud.
Cómo solucionarlo
- 1.
Comprobar qué habla el puerto
Si el puerto responde con HTTP plano, usa http:// o el puerto TLS real.
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.
Clientes de correo y de directorio: hacer coincidir el modo TLS con el puerto
Usa STARTTLS en el puerto de envío (587) y TLS implícito solo en el 465 (o ldaps:// en el 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.
Propietarios del servidor: separar los puertos HTTP y HTTPS
Apunta los clientes y las comprobaciones de estado a https://, o expón un conector HTTP plano que redirija al puerto 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.