Расшифровать клиентский SSL-трафик в Wireshark, созданный Java HttpsURLConnection

Я пытаюсь использовать программу Java с графическим интерфейсом пользователя, написанную кем-то другим, которая ведет себя не так, как я ожидал. В процессе работы программа обращается к серверу для получения данных, но не отображает правильные данные. Я пытаюсь установить, связана ли проблема с сетью, то есть правильные биты никогда не доходят до клиента.

Просматривая исходный код программы Java, похоже, что он использует HttpsURLConnection, чтобы получать данные с сервера через SSL. Я хотел бы иметь возможность проверять, что происходит в сети, с помощью Wireshark. Насколько я понимаю, Wireshark поддерживает дешифрование некоторого трафика SSL, если у вас есть соответствующий ключ (ключи). Я не контролирую сервер и поэтому не могу получить доступ к его закрытому ключу. Однако я контролирую клиента, на котором работает программа. Мой вопрос в том, как на практике я мог бы настроить wirehark для расшифровки трафика SSL для сценария, который я только что описал? Есть ли определенный ключ, который использует HttpsURLConnection, который я могу добавить в Wireshark? Есть еще что-нибудь?

Я должен отметить, что я подумал о простом добавлении регистрации в базу кода Java, но в конечном итоге предпочел бы основную правду о захвате пакетов, а не ведение журнала, поскольку я мог бы пропустить / пропустить что-то важное при регистрации базы кода, которую я не полностью понимать.


person Bryce Thomas    schedule 21.07.2012    source источник


Ответы (2)


Поскольку у вас нет доступа к закрытому ключу сервера, Wireshark не может использоваться для дешифрования напрямую.

Даже с закрытым ключом Wireshark не может расшифровать трафик в случае использования шифра с идеальной прямой секретностью (PFS).

Что вам нужно, так это прокси Man-in-The-Middle, который действует как SSL-сервер с точки зрения вашего приложения, а с точки зрения сервера он работает как клиент.

Существует множество программ, которые могут работать как прокси, например, Fiddler в .Net / Windows, Webscarab или BurpSuite (Java). Для всех этих программ вам необходимо экспортировать использованный сертификат сервера и добавить его в качестве доверенного сертификата в свою программу, например. указав подходящее хранилище доверенных сертификатов в командной строке при запуске приложения (см. свойство Java javax.net.ssl.trustStrore).

person Robert    schedule 21.07.2012
comment
Если я не могу расшифровать данные с сервера без его закрытого ключа с помощью wirehark, как это может сделать клиентское приложение? - person hacklikecrack; 28.05.2013
comment
Это делается с помощью протокола согласования ключей. В конце соглашения каждая сторона (клиент, сервер) знает секрет, но сам секрет никогда не передается между ними. См. Также обмен ключами Диффи – Хеллмана (Википедия) - person Robert; 28.05.2013

Вы можете извлечь ключи, необходимые Wireshark, из любого приложения Java, используя extract-ssl-secrets инструмент.

  • Загрузите банку локально из https://repo1.maven.org/maven2/name/neykov/extract-ssl-secrets/1.0.0/extract-ssl-secrets-1.0.0.jar. Убедитесь, что имя файла не изменилось - extract-ssl-secrets-1.0.0.jar.
  • Добавьте -javaagent:<absolute path to>/extract-ssl-secrets-1.0.0.jar=/tmp/secrets.log" в параметры виртуальной машины приложения.
  • Запустите Wireshark с wireshark -o ssl.keylog_file:/tmp/secrets.log
  • Начать захват трафика - его нужно расшифровывать на лету

См. раздел устранения неполадок, если он не работает сразу после установки.

person Svet    schedule 13.12.2016