OpenSSL: Відображення параметрів DH


15

При використанні шифрів SSL, що покладаються на диффузний обмін ключами, розмір приватного ключа, що використовується, має вирішальне значення для безпеки цього обміну ключами.

Коли я підключаюсь до сервера за допомогою інструмента "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 шифрів, вона містить модуль р , генератор г і сервер DH відкритий ключ у , в такому порядку, кожен виражається у вигляді великого цілого числа в форматі , описаному вище (16-бітний заголовок , який містить довжину в байтах, то ціле число значення в безпідписаному кодуванні big-endian).

Останні версії 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" DH & розмір або ECDH & крива, коли це застосовується, безпосередньо перед "рукостисканням прочитано 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 Рукостискання [довжина 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

(Вибірка зразка)
    Параметри DH PKCS # 3: (512 біт)
        прайм:
            xx: xx: xx: xx
            xx: xx: xx: xx
            xx: xx: xx: xx
        генератор: 2 (0x2)
Параметри ЦТ здаються нормальними.
----- ПОЧАТИ ПАРАМЕТРИ DH -----
XXXX
XXXX
----- ЗАКОНЧІ ПАРАМЕТРИ ЦЕГ ----

Сподіваюся, що це те, що ви шукаєте.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.