Precisamos nos conectar com nosso aplicativo (escrito em Java 8) para algum servidor muito antigo usando HTTPS. Sendo o Java 8, nosso cliente suporta TLSv1.2, TLSv1.1, TLSv1 e SSLv3. Claro, ele prefere usar o TLSv1.2, já que é o mais novo protocolo.
O servidor (Oracle-HTTP-Server 11.1.1.7), no entanto, suporta apenas TLSv1 e SSLx. Além disso, tem uma seleção muito limitada de conjuntos de cifras com suporte, mas ainda há um conjunto em comum que podemos usar com o TLSv1: SSL_RSA_WITH_3DES_EDE_CBC_SHA (também conhecido como TLS_RSA_WITH_3DES_EDE_CBC_SHA).
No entanto, a conexão direta falha com o término do handshake do servidor. A saída de depuração que obtemos (no lado do cliente) é assim:
main, WRITE: TLSv1.2 Handshake, length = 265
main, READ: TLSv1 Alert, length = 2
main, RECV TLSv1.2 ALERT: fatal, close_notify
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLException: Received fatal alert: close_notify
Para mim, parece que o servidor nem sequer tenta voltar ao TLSv1: assim que o cliente declara o TLSv1.2 como preferencial, o servidor fica suspenso.
Em comparação, quando desabilitamos explicitamente o TLSv1.2 e o TLSv1.1 em nosso cliente, tornando o TLSv1 a opção preferida, o handshake é bem-sucedido.
Também tentamos nos conectar a outro servidor legado que não conhece TLSv1.2 e TLSv1.1, mas aqui a conexão funciona conforme o esperado: mesmo que o cliente diga que prefere TLSv1.2 , eles concordam com o servidor para usar o TLSv1, como o melhor protocolo comum:
main, WRITE: TLSv1.2 Handshake, length = 269
main, READ: TLSv1 Handshake, length = 85
...
Pergunta: é dever do servidor escolher a lista de protocolos TLS / SSL que o cliente suporta? Posso dizer aos mantenedores do servidor que é o servidor que se comporta mal, não nosso cliente?