Por que o Wireshark mostra na visão geral o Protocolo TLSv1.3, mas nos detalhes da Versão TLS 1.2?
O Wireshark reporta o TLS 1.3 na coluna de protocolo devido ao Server Hello que contém uma extensão de Versões Suportadas com o TLS 1.3.
Lembre-se de que as sessões TLS começam com um handshake para negociar parâmetros como a versão do protocolo e as cifras. O cliente envia uma mensagem de handshake do Client Hello em um registro TLS contendo:
- Registro TLS - Versão: versão TLS mínima suportada (no TLS 1.2 e anterior). No TLS 1.3, esse campo não é realmente usado e DEVE ser 0x0303 ("TLS 1.2") ou 0x301 ("TLS 1.0") para fins de compatibilidade. Referência: RFC 8446 (página 79)
- Client Hello - Version: versão máxima suportada do TLS (no TLS 1.2 e anterior). No TLS 1.3, este campo não é usado, mas DEVE ser definido como 0x0303 ("TLS 1.2"). Referência: RFC 8446 (4.1.2. Cliente Hello)
- Client Hello - Extensão de versões suportadas: lista de versões suportadas. Este é o único valor usado pelas implementações do TLS 1.3 (que podem concordar com o TLS 1.3, 1.2 ou outras versões). Referência: RFC 8446 (4.2.1. Versões suportadas)
O servidor envia uma mensagem de handshake do Server Hello com:
- Olá Servidor - Versão: versão negociada (para TLS 1.2 e anterior). Se o TLS 1.3 for negociado, DEVE ser definido como 0x0303 ("TLS 1.2").
- Hello do servidor - versões suportadas: uma única versão negociada (para TLS 1.3). Não pode ser usado para negociar versões anteriores.
Portanto, no TLS 1.2, o cliente envia um intervalo de versões suportadas, enquanto um cliente TLS 1.3 envia uma lista de versões suportadas. O servidor escolherá uma única versão, mas, para fins de compatibilidade, usará um novo campo para selecionar o TLS 1.3 ou mais recente.
(Mesmo que um cliente anuncie o suporte para alguma versão (por exemplo, através de uma versão de registro TLS contendo "TLS 1.0"), ele ainda poderá falhar no handshake, se o servidor concordar com esta versão baixa.)
Outra coisa a ter em atenção: o Wireshark tenta interpretar um pacote imediatamente quando ele é recebido. No momento em que o Client Hello é recebido, ele não conhece a versão final e, portanto, assume a versão de registro TLS. Quando o Server Hello é recebido, ele pode ajustar a versão de acordo:
$ tshark -r test/captures/tls13-rfc8446.pcap
1 0.000000 10.9.0.1 → 10.9.0.2 TLSv1 304 Client Hello
2 0.002634 10.9.0.2 → 10.9.0.1 TLSv1.3 658 Server Hello, Change Cipher Spec, Application Data
3 0.005266 10.9.0.1 → 10.9.0.2 TLSv1.3 130 Change Cipher Spec, Application Data
4 0.005772 10.9.0.2 → 10.9.0.1 TLSv1.3 468 Application Data
...
Em uma dissecção de duas passagens (que também inclui a GUI do Wireshark), a versão acordada será conhecida quando imprimir os resultados da segunda passagem:
$ tshark -r test/captures/tls13-rfc8446.pcap -2
1 0.000000 10.9.0.1 → 10.9.0.2 TLSv1.3 304 Client Hello
2 0.002634 10.9.0.2 → 10.9.0.1 TLSv1.3 658 Server Hello, Change Cipher Spec, Application Data
3 0.005266 10.9.0.1 → 10.9.0.2 TLSv1.3 130 Change Cipher Spec, Application Data
4 0.005772 10.9.0.2 → 10.9.0.1 TLSv1.3 468 Application Data
...
Captura de teste usada acima: https://github.com/wireshark/wireshark/blob/master/test/captures/tls13-rfc8446.pcap