
Я пытаюсь выполнить ручное извлечение/шифрование/дешифрование данных с помощью 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 байт.
решение1
Я не совсем уверен, но думаю, что ответ — нет. openssl
Клиент командной строки — это разнородный набор инструментов. Команды X.509 могут быть полезны для манипуляций с сертификатами, но команды криптографии редко бывают полезны для чего-либо, кроме тестирования самого OpenSSL.
Если вам необходимо выполнять криптографические вычисления с использованием распространенных алгоритмов, я рекомендую интерактивную командную строку Python сКриптокуполбиблиотека.
Но для расшифровки SSL-соединений проще всего использовать Wireshark.Сообщите Wireshark, где найти закрытый ключи он расшифрует TLS-соединение, использующее шифрование RSA. Для соединений, использующих эфемерный Diffie-Hellman, вы не можете расшифровать трафик только с помощью ключа, вам нужнодополнительная информация от клиента или сервера.
Обратите внимание, что использование TLS_RSA_WITH_AES_256_CBC_SHA
набора шифров — плохая идея по нескольким причинам:
- У него нетпрямая секретность, поэтому если закрытый ключ сервера когда-либо будет скомпрометирован, все соединения, установленные с этим ключом, также будут скомпрометированы. Шифронаборы, использующие обмен ключами Диффи-Хеллмана (с EDH или ECDHE в названии), имеют прямую секретность.
- Он использует дешифрование RSA, которое включает заполнение, что является классическим источником ошибок реализации и утечки через побочные каналы. Шифронаборы с EDH или ECDHE в названии в дополнение к RSA или с DSA или ECDSA используют подписи вместо дешифрования и с меньшей вероятностью страдают от дефектов реализации.
- Он использует дешифрование CBC, которое включает в себя заполнение, что является классическим источником ошибок реализации и утечки через побочные каналы. Наборы шифров без CBC в названии с меньшей вероятностью страдают от дефектов реализации.
решение2
RSAES-PKCS1v1_5, который использует SSL/TLS-through-1.2 plain-RSA keyexchange, может быть расшифрован с помощью операций командной строки OpenSSLrsautl
илиpkeyutl
(последняя с версии 1.1.0 в 2010 году). Смотрите соответствующие страницы руководства, которые должны быть доступны в вашей системе, если это не Windows, илиВ сети.
Обратите внимание, что это дает вам premaster secret, который сам по себе не может расшифровать (или аутентифицировать) трафик. Вы должны использовать premaster плюс nonces для получения master secret, а затем master secret плюс nonces для получения рабочих ключей (множественное число). Функция вывода 'PRF' отличается для SSLv3 (больше не используется), TLS 1.0 и 1.1 (RFC 2246 и 4346) и TLS 1.2 (RFC 5246). (PRF снова будет отличаться в TLS 1.3 в черновом варианте, но это также полностью исключит простой обмен ключами RSA.)
Командная строка не может напрямую обращаться к PRF SSL/TLS, но может обращаться к HMAC, из которых они построены (за исключением SSLv3); см. страницу руководства dgst
в тех же местах, что и выше, и обратите внимание, -hmac $key
что может обрабатывать только последовательности байтов, которые могут быть переданы из shell/etc, но это не все, поэтому вам может понадобиться -mac hmac -macopt hexkey:$hexkey
вместо этого.
Тем не менее, я согласен с Жилем, что гораздо проще позволить это сделать wireshark. Если ваша проблема в том, что у вас есть данные в какой-то форме, отличной от файла захвата, дистрибутивы wireshark поставляются с несколькими вспомогательными инструментами командной строки для манипулирования файлами, которые обычно могут создать поддельный захват, который в этом случае wireshark или tshark main могут затем расшифровать.