2

Я пытаюсь сделать ручное извлечение / шифрование / дешифрование данных с помощью инструмента командной строки openssl .

Я просматривал RFC5246, чтобы понять, что мне нужно делать. Мне не совсем ясно, смогу ли я сделать этот шаг с помощью этого инструмента. Я предполагаю, что закрытый ключ в объяснении является личным ключом, сгенерированным, когда я создал свой самозаверяющий сертификат.

Когда RSA используется для аутентификации сервера и обмена ключами, 48-байтовый pre_master_secret генерируется клиентом, шифруется под открытым ключом сервера и отправляется на сервер. Сервер использует свой закрытый ключ для расшифровки pre_master_secret. Затем обе стороны преобразуют pre_master_secret в master_secret, как указано выше.

Может кто-нибудь сказать мне, если мои предположения верны. Может ли инструмент командной строки openssl использоваться и поставляться с закрытым ключом моего сервера и зашифрованным pre_master_secret от клиента для генерации ключа pre_master для сервера, чтобы его можно было использовать для создания мастер-ключа?

Если это так, я не уверен, как это сделать, потому что я не очень знаком с инструментом.

Еще одна вещь, на которую я должен обратить внимание, это то, что набор шифров, с которым я работаю, это TLS_RSA_WITH_AES_256_CBC_SHA, и я вижу в Wireshark, что pre_master_secret от клиента имеет длину 256 байт.

2 ответа2

4

Я не совсем уверен, но я думаю, что ответ - нет. Клиент командной строки openssl - это разнородный набор инструментов. Команды X.509 могут быть полезны для управления сертификатами, но команды криптографии редко полезны для чего-либо другого, кроме тестирования самого OpenSSL.

Если вам нужно выполнять криптографические вычисления с помощью распространенных алгоритмов, я рекомендую интерактивную командную строку Python с библиотекой Cryptodome .

Но для расшифровки SSL-соединений обычно проще всего использовать Wireshark. Сообщите Wireshark, где найти закрытый ключ, и он расшифрует соединение TLS, использующее шифрование RSA. Для соединений, использующих эфемерный Diffie-Hellman, вы не можете дешифровать трафик одним ключом, вам нужна дополнительная информация от клиента или сервера.


Обратите внимание, что использование TLS_RSA_WITH_AES_256_CBC_SHA TLS_RSA_WITH_AES_256_CBC_SHA является плохой идеей по нескольким причинам:

  • Он не имеет прямой секретности, поэтому, если закрытый ключ сервера когда-либо будет скомпрометирован, все соединения, сделанные с этим ключом, также будут скомпрометированы. Наборы шифров, которые используют обмен ключами Диффи-Хеллмана (с EDH или ECDHE в их названии), имеют прямую секретность.
  • Он использует расшифровку RSA, которая включает в себя заполнение, которое является классическим источником ошибок реализации и утечки через боковые каналы. Шифраторы с EDH или ECDHE в названии в дополнение к RSA или с DSA или ECDSA используют сигнатуры вместо дешифрования и менее подвержены дефектам реализации.
  • Он использует расшифровку CBC, которая включает в себя заполнение, которое является классическим источником ошибок реализации и утечки через боковые каналы. Ciphersuites без CBC в их названии менее подвержены дефектам реализации.
1

RSAES-PKCS1v1_5, который использует обмен ключами SSL/TLS-через-1.2 plain-RSA, может быть расшифрован операциями командной строки OpenSSL rsautl или pkeyutl (последний с версии 1.1.0 в 2010 году). Просмотрите их соответствующие справочные страницы, которые должны быть доступны в вашей системе, если не в Windows, или в Интернете.

Обратите внимание, что это дает вам секрет перед мастером, который сам по себе не может расшифровать (или аутентифицировать) трафик. Вы должны использовать premaster плюс одноразовые номера для получения главного секрета, а затем мастер-секрет плюс nonces для получения рабочих ключей (множественное число). Функция деривации «PRF» отличается между SSLv3 (больше не используется), TLS 1.0 и 1.1 (RFC 2246 и 4346) и TLS 1.2 (RFC 5246). (PRF снова будет отличаться в TLS 1.3 в том виде, как он был составлен, но это также полностью исключит простой обмен ключами RSA.)

Командная строка не может получить доступ к SSL/TLS PRF напрямую, но может выполнять HMAC, из которых они построены (кроме SSLv3); см. справочную страницу dgst в тех же местах, что и выше, и обратите внимание, -hmac $key может обрабатывать только последовательности байтов, которые могут быть переданы из оболочки /etc, но это еще не все, поэтому вам может потребоваться -mac hmac -macopt hexkey:$hexkey вместо этого hexkey .

Тем не менее, я согласен с Жилем, гораздо проще позволить Wireshark сделать это. Если ваша проблема заключается в том, что у вас есть данные в какой-либо форме, отличной от файла захвата, дистрибутивы wireshark поставляются с несколькими вспомогательными инструментами командной строки для манипулирования файлами, которые обычно могут создавать поддельный захват, который в этом случае может затем расшифровать wireshark или tshark main.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .