OpenSSL: Exibir parâmetros DH


15

Ao usar as Cifras SSL baseadas em uma troca de chaves hellman diferente, o tamanho da chave privada empregada é de importância crucial para a segurança dessa troca de chaves.

Quando me conecto a um servidor usando a ferramenta "openssl s_client", como posso consultar os parâmetros DH usados?

Respostas:


17

Não conheço uma opção de linha de comando fácil de usar, mas na openssl s_clientlinha de comando, você pode adicionar a -msgopção para obter um despejo hexadecimal da mensagem de handshake. Então procure a ServerKeyExchangemensagem; 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 ServerKeyExchangeformato é diferente, é claro.

Veja o padrão para a definição da ServerKeyExchangemensagem. 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 ServerKeyExchangemensagem). 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) .


1
O OpenSSL não seleciona automaticamente o DHE, mas um retorno de chamada de aplicativo pode. O OpenSSL 1.0.2 (janeiro de 2015) pode, opcionalmente , selecionar automaticamente ECDHE , e também na 1.0.2 s_clientsempre 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).
David_thompson_085

Eu uso 1.0.1e openssl e eu não obter qualquer ServerKeyExchangecom 0c 00 03 0b. você pode fornecer o comando exato para obter a saída? Eu tenho nenhum dos apertos de mão começando com0c
rubo77

Se o conjunto de cifras selecionado pelo servidor não for um conjunto de cifras "DHE" ou "ECHDE", não haverá mensagem ServerKeyExchange.
Thomas Pornin

Recebo <<< TLS 1.2 Handshake [comprimento 01cd], ServerKeyExchange 0c 00 01 c9 03 00 17 41 04 08 5f 82 88 1e e5 b6 seguido de 443 octetos que correspondem a um comprimento de 0x1c9 começando no quinto octeto. No entanto, "0300" parece significar 768 octetos, enquanto eu tenho certeza de que meu parâmetro DH é "apenas" 2048 bits.
precisa saber é o seguinte

1
@ Law29 Parece mais um ECDHE ServerKeyExchange. Se estiver usando uma curva elíptica, o "03" significa "esta é uma curva nomeada, os próximos dois bytes codificam o identificador da curva". Então "00 17" é o identificador da curva, que é o NIST P-256 (a curva mais usada para ECDHE). Então "41" é o comprimento do ponto público, que é exatamente o valor certo para um ponto P-256 em formato não compactado; esse ponto começaria com um byte de valor 0x04 e é exatamente isso que você tem. Resumindo: parece que o seu handshake TLS 1.2 realmente usa ECDHE, não DHE.
Thomas Pornin

9

Se você possui o certificado no formato PEM, pode tentar este comando, ele deve fornecer uma saída adequada do comando Openssl.

openssl dhparam -inform PEM -in ./imapd.pem -check -text

(Saída de amostra)
    PKCS # 3 DH Parâmetros: (512 bits)
        prime:
            xx: xx: xx: xx
            xx: xx: xx: xx
            xx: xx: xx: xx
        gerador: 2 (0x2)
Os parâmetros DH parecem estar ok.
----- COMEÇAR PARÂMETROS DH -----
XXXX
XXXX
----- PARÂMETROS DE END DH -----

Espero que seja isso que você está procurando.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.