OpenSSL: отображение параметров DH

15

При использовании SSL-шифров, основанных на обмене ключами diffie-hellman, размер используемого закрытого ключа имеет решающее значение для безопасности такого обмена ключами.

Когда я подключаюсь к серверу с помощью инструмента openssl s_client, как я могу запрашивать используемые параметры DH?


источник

Ответы:

17

Я не знаю простого в использовании переключателя командной строки, но в openssl s_clientкомандной строке вы можете добавить -msgопцию для получения шестнадцатеричного дампа сообщения рукопожатия. Затем найдите ServerKeyExchangeсообщение; это должно выглядеть так:

<<< 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
    (...)

и это читается так:

  • 0c 00 03 0b: сообщение типа «ServerKeyExchange» (это «0c») длиной 0x00030B байтов.
  • Первый элемент - это модуль DH в виде большого целого числа с заголовком длиной в два байта. Здесь длина кодируется как 01 00, означая целое число, закодированное в 0x0100 байтов. Это 256 байт, поэтому модуль имеет длину от 2041 до 2048 бит.
  • Байты модуля следуют в порядке без знака в старшем порядке. Верхний байт , что модуль упругости, в этом случае ff ff ff ff.... Модуль имеет длину ровно 2048 бит.

Если вы используете набор шифров ECDHE (эллиптическая кривая), то ServerKeyExchange, конечно, формат будет другим.

См. Стандарт для определения ServerKeyExchangeсообщения. Для наборов шифров DHE он содержит модуль p , генератор g и открытый ключ DH сервера y в том порядке, каждый из которых выражается как большое целое число в формате, описанном выше (16-битный заголовок, который содержит длину в байтах, затем целое число значение в беззнаковой кодировке с прямым порядком байтов).

Последние версии OpenSSL имеют тенденцию выбрать размер DH модуль , который соответствует (с точки зрения безопасности) силы пары ключей сервера (используется для подписать на ServerKeyExchangeсообщение). В приведенном выше примере сервер имеет 2048-битный ключ RSA, поэтому OpenSSL решил использовать 2048-битный модуль DH (в этом случае хорошо известный модуль, описанный в RFC 3526, раздел 3 ).

Некоторые другие серверы используют 1024-битные группы DH, чтобы обеспечить совместимость с некоторыми существующими клиентами, которые не поддерживают большие группы DH (наибольшим нарушителем является реализация SSL в Java, исправленная в Java 8 build 56 в 2012 году). Известный недостаток протокола TLS для наборов шифров DHE состоит в том, что у клиента нет возможности указать, какой размер модуля он может поддерживать (это исправлено для ECDHE, поскольку клиент может указать точный список кривых, которые он принимает) ,

Томас Порнин
источник
1
OpenSSL не выполняет автоматический выбор DHE, но может выполнить обратный вызов приложения. OpenSSL 1.0.2 (январь 2015 г.) может при желании автоматически выбирать ECDHE , а также в 1.0.2 s_clientвсегда отображает «Temp server key» DH & size или ECDH & curve, когда это применимо, непосредственно перед «рукопожатием прочитано x и написано y», поэтому вам больше не нужно расшифровать его. Это недавний Apache mod_ssl, который автоматически выбирает DHE: httpd.apache.org/docs/trunk/mod/mod_ssl.html#sslcertificatefile (который отмечает проблему с клиентами Java).
dave_thompson_085
Я использую openssl 1.0.1e, и я не получаю ServerKeyExchangeс 0c 00 03 0b. Можете ли вы предоставить точную команду, чтобы получить вывод? У меня нет ни одного рукопожатия, начинающегося с0c
rubo77
Если набор шифров, выбранный сервером, не является набором шифров «DHE» или «ECHDE», то сообщение ServerKeyExchange не будет.
Томас Порнин
Я получаю <<< TLS 1.2 Handshake [длина 01cd], ServerKeyExchange 0c 00 01 c9 03 00 17 41 04 08 5f 82 88 1e e5 b6, за которым следуют 443 октета, которые соответствуют длине 0x1c9, начиная с пятого октета. Однако «0300» означает 768 октетов, хотя я уверен, что мой параметр DH «всего» 2048 бит.
Закон 29
1
@ Law29 Это больше похоже на ECDHE ServerKeyExchange. Если используется эллиптическая кривая, то «03» означает «это именованная кривая, следующие два байта кодируют идентификатор кривой». Тогда «00 17» - это идентификатор кривой, который представляет собой NIST P-256 (наиболее часто используемая кривая для ECDHE). Тогда «41» - это длина публичной точки, которая является точно правильным значением для точки P-256 в несжатом формате; такая точка будет начинаться с байта со значением 0x04, и это именно то, что у вас есть. Подводя итог: кажется, ваше рукопожатие TLS 1.2 действительно использует ECDHE, а не DHE.
Томас Порнин
9

Если у вас есть сертификат в формате PEM, вы можете попробовать эту команду, она должна дать вам правильный вывод из команды Openssl.

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

(Образец вывода)
    PKCS # 3 DH Параметры: (512 бит)
        премьер:
            хх: хх: хх: хх
            хх: хх: хх: хх
            хх: хх: хх: хх
        генератор: 2 (0x2)
Параметры DH, кажется, в порядке.
----- НАЧАТЬ DH ПАРАМЕТРЫ -----
XXXX
XXXX
----- КОНЕЦ DH ПАРАМЕТРОВ -----

Надеюсь, это то, что вы ищете.

Дэвид Ло
источник