Não conheço uma opção de linha de comando fácil de usar, mas na openssl s_client
linha de comando, você pode adicionar a -msg
opção para obter um despejo hexadecimal da mensagem de handshake. Então procure a ServerKeyExchange
mensagem; deve ficar assim:
<<< TLS 1.2 Handshake [length 030f], ServerKeyExchange
0c 00 03 0b 01 00 ff ff ff ff ff ff ff ff c9 0f
da a2 21 68 c2 34 c4 c6 62 8b 80 dc 1c d1 29 02
4e 08 8a 67 cc 74 02 0b be a6 3b 13 9b 22 51 4a
(...)
e lê assim:
0c 00 03 0b
: mensagem do tipo "ServerKeyExchange" (que é o "0c") com 0x00030B bytes de comprimento.
- O primeiro elemento é o módulo DH como um grande número inteiro, com um cabeçalho de dois bytes de comprimento. Aqui, o comprimento é codificado como
01 00
, significando um número inteiro codificado em 0x0100 bytes. Como 256 bytes, o módulo tem comprimento entre 2041 e 2048 bits.
- Os bytes do módulo seguem, em ordem big endian não assinada. Os bytes superiores desse módulo são, neste caso
ff ff ff ff...
,. O módulo tem comprimento exatamente 2048 bits.
Se você usa um conjunto de cifras ECDHE (curva elíptica), o ServerKeyExchange
formato é diferente, é claro.
Veja o padrão para a definição da ServerKeyExchange
mensagem. Para conjuntos de cifras DHE, ele contém o módulo p , gerador ge chave pública DH do servidor y , nessa ordem, cada um expresso como um grande número inteiro no formato descrito acima (cabeçalho de 16 bits que contém o comprimento em bytes e, em seguida, o número inteiro valor na codificação big endian não assinada).
As versões recentes do OpenSSL tendem a selecionar um tamanho de módulo DH que corresponda (do ponto de vista da segurança) à força do par de chaves do servidor (usado para assinar a ServerKeyExchange
mensagem). No exemplo acima, o servidor possui uma chave RSA de 2048 bits; portanto, o OpenSSL optou por usar um módulo DH de 2048 bits (nesse caso, o conhecido módulo descrito na RFC 3526, seção 3 ).
Alguns outros servidores aderem a grupos DH de 1024 bits para garantir a compatibilidade com alguns clientes existentes que não suportam grupos DH maiores (o maior agressor é a implementação do SSL em Java, corrigida no Java 8 build 56 em 2012). Uma falha conhecida no protocolo TLS, para os conjuntos de cifras DHE, é que o cliente não tem como especificar qual tamanho de módulo pode suportar (isso é corrigido para ECDHE, porque o cliente pode especificar a lista exata de curvas que aceita) .
s_client
sempre exibe "Chave do servidor Temp" DH & size ou ECDH & curve quando aplicável, logo antes "do handshake ter lido x e escrito y", para que você não precise mais decodificar. É o Apache mod_ssl recente que seleciona automaticamente o DHE: httpd.apache.org/docs/trunk/mod/mod_ssl.html#sslcertificatefile (que observa o problema dos clientes Java).