SSL handshake: o servidor deve escolher um protocolo anterior?

1

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?

    
por doublep 30.08.2016 / 12:59

1 resposta

3

is it the server's duty to choose out of the list of TLS/SSL protocols the client supports?

O cliente não fornece uma lista de versões suportadas. O cliente fornece a melhor versão que pode oferecer e o servidor deve responder com a melhor versão suportada pelo servidor, que é igual ou menor à versão do cliente. Se o cliente não estiver disposto a aceitar uma versão muito baixa, o cliente lançará um erro e fechará a conexão.

Can I say to the server maintainers that it is the server that misbehaves, not our client?

Eu acho que você pode dizer isso. Qualquer servidor que implemente corretamente o TLS 1.0 deve ser capaz de lidar com uma conexão TLS 1.2 do cliente, porque o protocolo é especificamente projetado dessa maneira. Infelizmente ainda existem implementações de TLS quebradas por aí.

    
por 30.08.2016 / 13:06

Tags