Вопрос или проблема
Я пытаюсь захватить мастер-ключи, используемые для шифрования TLS, когда curl запускается из PowerShell, но файл журнала всегда пуст.
Я уже загрузил curl и создал псевдоним в своем профиле:
> set-alias curl d:\...\bin\curl.exe
Когда я проверяю версию, кажется, что PowerShell использует правильную версию:
> curl --version
curl 8.11.1 (x86_64-w64-mingw32) libcurl/8.11.1 LibreSSL/4.0.0 zlib/1.3.1 brotli/1.1.0 zstd/1.5.6 WinIDN libpsl/0.21.5 libssh2/1.11.1 nghttp2/1.64.0 ngtcp2/1.10.0 nghttp3/1.7.0
Release-Date: 2024-12-11
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns ldap ldaps mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp ws wss
Features: alt-svc AsynchDNS brotli CAcert HSTS HTTP2 HTTP3 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM PSL SPNEGO SSL SSPI threadsafe UnixSockets zstd
Тем не менее, я не могу получить заполненный файл мастер-ключа:
> pwsh -command {$env:SSLKEYLOGFILE='sslkey.log'; curl -s "https://somesite.org"}
> cat sslkey.log
> ls
Directory: C:\Users\luisabreu\tests
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 1/20/2025 11:33 AM 0 sslkey.log
Файл создается, но он всегда пуст.
Чего мне не хватает?
Поскольку вы используете LibreSSL (как показано в выводе версии curl), это может быть корнем вашей проблемы. LibreSSL не поддерживает SSLKEYLOGFILE так же, как OpenSSL.
Таким образом, чтобы решить эту проблему:
-
Во-первых, вам нужно получить сборку curl, использующую OpenSSL вместо LibreSSL. Вы можете проверить официальные загрузки curl или использовать менеджер пакетов, такой как Chocolatey или Scoop, которые предоставляют сборки на основе OpenSSL.
-
Как только у вас будет правильная сборка, попробуйте установить переменную окружения перед запуском curl. В PowerShell это можно сделать в одной строке:
$env:SSLKEYLOGFILE="$PWD\sslkey.log"; curl -s "https://somesite.org"
- Если вы хотите убедиться, что используете сборку на основе OpenSSL, проверьте вывод версии — там должно быть указано OpenSSL вместо LibreSSL.
Альтернативный подход, если вы хотите остаться на текущей настройке:
- Используйте встроенные возможности Wireshark для дешифрования TLS
- Или используйте Fiddler, который может дешифровать HTTPS-трафик без необходимости SSLKEYLOGFILE
Ответ или решение
Ваш вопрос связан с проблемой пустого файла sslkey.log
при запуске curl
из PowerShell, когда вы пытаетесь зафиксировать мастер-ключи, используемые для TLS-шифрования. На основе предоставленных данных, проблема может возникать из-за того, что используемая вами сборка curl
основана на LibreSSL, который не поддерживает переменную среды SSLKEYLOGFILE
так, как это делает OpenSSL.
Теория (Theory):
Начнем с рассмотрения того, что SSLKEYLOGFILE
— это переменная среды, которая используется некоторыми библиотеками SSL для записи мастер-ключей TLS в указанный файл. Когда эти ключи записываются, они могут быть использованы для расшифровки TLS-трафика средствами вроде Wireshark. Эта фича изначально была поддержана в OpenSSL, но, к сожалению, отсутствие поддержки в LibreSSL не позволяет вести логирование ключей в файл, что и является корнем вашей проблемы.
Пример (Example):
Вы загрузили и настроили curl
в PowerShell, указав путь к его исполняемому файлу и проверив его версию. В выводе команды curl --version
, который вы представили, видно, что curl
использует LibreSSL:
curl 8.11.1 (x86_64-w64-mingw32) libcurl/8.11.1 LibreSSL/4.0.0
Это указывает на использование LibreSSL вместо OpenSSL. При установке переменной среды SSLKEYLOGFILE
и запуске curl
, файл sslkey.log
создается, но остается пустым.
Применение (Application):
Чтобы решить эту проблему, вам следует использовать сборку curl
, которая основана на OpenSSL. Следующие шаги помогут вам достичь требуемого результата:
-
Установка
curl
с OpenSSL:-
Вместо LibreSSL-зависимого
curl
, загрузите версию, которая поддерживает OpenSSL. Это можно сделать, используя менеджеры пакетов, такие как Chocolatey или Scoop, которые предоставляют сборкиcurl
с поддержкой OpenSSL. -
Пример установки через Chocolatey может выглядеть так:
choco install curl -y
-
Убедитесь, что при использовании команды
curl --version
в выводе указаноOpenSSL
:curl 8.11.1 (x86_64-w64-mingw32) libcurl/8.11.1 OpenSSL/1.x.x
-
-
Установка переменной среды:
-
В PowerShell установите переменную среды
SSLKEYLOGFILE
перед запускомcurl
, чтобы убедиться в ее применении:$env:SSLKEYLOGFILE="$PWD\sslkey.log"; curl -s "https://somesite.org"
-
Теперь файл
sslkey.log
должен содержать записи мастер-ключей TLS.
-
-
Варианты альтернативного решения:
- Если вам необходимо сохранить текущую конфигурацию LibreSSL, рассмотрите возможность использования инструментов, таких как Wireshark, которые могут работать с перехватом и декодированием TLS-трафика без необходимости в SSLKEYLOGFILE.
- Еще одним вариантом является Fiddler — прокси-сервер, который может расшифровывать HTTPS-трафик и предоставлять информацию о TLS-шифровании.
Подводя итог, для успешного логирования мастер-ключей TLS с использованием переменной среды SSLKEYLOGFILE
, необходима версия curl
с поддержкой OpenSSL. Если установка этого инструмента вызывает затруднения, воспользуйтесь альтернативными инструментами, чтобы достичь аналогичных результатов по расшифровке и анализу сетевого трафика.