Mensagem de erro
javax.net.ssl.SSLException: Unsupported or unrecognized SSL message
Também aparece como
- Unsupported or unrecognized SSL message
O JDK 25 imprime o mesmo texto no lado do cliente e em um servidor JSSE que recebe HTTP não criptografado (os dois casos foram verificados). Quando o outro lado não envia nada e fecha a conexão, o Java informa, em vez disso, “Remote host terminated the handshake”.
Java (JSSE) — the peer's reply is not a TLS record
O que significa
O JSSE esperava um registro TLS e recebeu bytes que não consegue interpretar como tal, quase sempre o texto de uma resposta HTTP vinda de um servidor HTTP não criptografado. No lado do cliente, foi usado https:// com uma porta que não fala TLS; no lado do servidor (um listener TLS do Tomcat ou do Netty), um cliente enviou HTTP não criptografado para a porta TLS. O certificado não tem relação com o problema.
Por que acontece
https:// em uma porta que serve HTTP não criptografado
comumServiços internos atrás de um proxy que faz a terminação do TLS, portas de actuator ou de métricas e servidores de desenvolvimento locais costumam falar HTTP não criptografado.
O proxy fala HTTP não criptografado, mas foi configurado como TLS
comumProxies de encaminhamento normalmente aceitam HTTP não criptografado e criam um túnel para o HTTPS com CONNECT; configurar TLS até o próprio proxy produz este erro.
TLS implícito em uma porta STARTTLS
ocasionalSMTP nas portas 587/25 (com mail.smtp.ssl.enable=true nelas), LDAP na 389 com ldaps:// ou bancos de dados que esperam a passagem para TLS dentro da própria conexão.
Log do servidor: um cliente enviou HTTP não criptografado para a porta TLS
ocasionalHealth checks ou usuários que acessam http://host:8443 fazem o conector TLS registrar isso no log a cada requisição.
Como corrigir
- 1.
Verificar qual protocolo a porta fala
Se a porta responder em HTTP não criptografado, use http:// ou a porta 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 e-mail e de diretório: combinar o modo TLS com a porta
Use STARTTLS na porta de submissão (587) e TLS implícito apenas na 465 (ou ldaps:// na 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.
Donos do servidor: separar as portas HTTP e HTTPS
Aponte os clientes e os health checks para https://, ou exponha um conector HTTP não criptografado que redirecione para a porta 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.