Я не знаю простого в использовании переключателя командной строки, но в командной строке 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, поскольку клиент может указать точный список кривых, которые он принимает),