Как работает прокси-сервер Charles при прокси-трафике SSL?
Когда я хочу просмотреть SSL-трафик, который передается через Charles, мне нужно иметь SSL-сертификат от Charles, установленный на смартфоне. Зачем это нужно и как Чарльз может расшифровать, а затем снова зашифровать данные, передаваемые через него?
Я представляю это так, что если какое-то приложение для смартфона использует SSL, то:
- данные зашифрованы (приложением "сетевыми уровнями ОС"), а затем
- зашифрованные данные отправляются в мир и
- зашифрованные данные перехвачены Чарльзом
- Чарльз получает зашифрованные данные и что теперь?
Как он знает, как расшифровать зашифрованные данные? И как он узнает, как снова зашифровать дешифрованные данные, чтобы, наконец, отправить их туда, куда они были изначально нацелены?
3 ответа
Я создатель Proxyman, прокси-сервера для веб-отладки macOS, такого как Charles Proxy, поэтому у меня может быть понимание и опыт, чтобы ответить на ваши вопросы.
- Когда вы запускаете Proxyman / Charles, он откроет сервер с IP=127.0.0.1, портом 9090 или 8080. Он также переопределяет прокси HTTP / HTTPS в сети -> Wi-Fi -> Дополнительно -> вкладка Прокси.
Важно убедиться, что весь трафик будет проходить через сервер Proxyman / Charles.
Если это iPhone, вам нужно вручную установить конфигурацию прокси в приложении «Настройки». Руководство: https://docs.proxyman.io/debug-devices/ios-device
Как только клиент (macOS) или приложение iOS (устройства iOS) отправит HTTPS-запрос с помощью Proxy Config. Первый запрос - это запрос CONNECT к Proxyman / Charles Server.
Proxyman принимает его и возвращает 200 OK Status.
Ваше приложение и сервер Proxyman будут выполнять рукопожатие SSL.
Чтобы добиться успеха, вы должны установить сертификат Proxyman / Charles CA и доверять ему, который является самозаверяющим сертификатом.
- Для macOS: установите System Keychain.app и доверяйте ему
- Для iOS: вам необходимо посетить http://proxy.man/ssl (или http://chls.pro/ssl ).
4.1. Proxyman извлекает ключ хоста из предыдущего запроса CONNECT и начинает получение фактического сервера сертификатов.
4.2. Proxyman анализирует сертификат и получает всю информацию о сертификате, такую как организация, имя, общее имя, альтернативное имя субъекта (DNS и IP-адрес) и т. Д.
Насколько мне известно, Чарльз Прокси не выполняет этот шаг. Он просто генерирует базовый листовой сертификат. Некоторые клиенты могут обнаружить недостающие данные в листовом сертификате и отклонить его.
4.3. Proxyman начинает генерировать листовой сертификат с помощью Proxyman CA Certificate. Важно создать тот же сертификат, в котором будет та же информация с сервера.
Если это приложение для macOS / iOS, убедитесь, что сертификат соответствует новым требованиям безопасности от Apple . В противном случае он может быть отклонен.
Этот шаг можно реализовать с помощью библиотеки OpenSSL или BoringSSL.
4.4. Сервер Proxyman отправляет листовой сертификат обратно клиенту. 4.5. Клиент проверит листовой сертификат, и он будет передан. Потому что сертификату CA доверяют в их системе и он проходит базовую оценку, например:
- Общее имя и DNS-имя должны совпадать с хостом.
- Срок действия не истек
- Используйте алгоритмы шифрования приема
- и более
На этом этапе рукопожатие SSL завершено, и клиент начинает отправлять HTTPS-запрос.
Proxyman теперь действует как сервер, поэтому Proxyman может расшифровать прочитанный запрос HTTPS в виде обычного текста.
Proxyman теперь действует как клиент и подключается к серверу. Тогда начните отправлять запрос. Этот шаг действительно прост, потому что сертификат сервера подписан известным сертификатом CA.
Как только Proxyman получает ответ, Proxyman читает его и отправляет обратно клиенту.
Клиент получает ответ и работает в обычном режиме.
Поскольку Proxyman может видеть запрос / ответ в виде обычного текста, он может отображаться в приложении или выполнять несколько инструментов отладки для изменения данных, таких как Map Local, Scripting, Breakpoint и т. Д.
Это длинный ответ, и я надеюсь, что смог ответить на ваше беспокойство.
Хорошо, что я собираюсь опубликовать здесь, так это то, как я думаю, что SSL-прокси работает с Чарльзом, но у меня нет какой-либо твердой основы, чтобы гарантировать, что мой ответ правильный. На самом деле, было бы здорово, если бы кто-то из команды Charles Proxy мог помочь нам в этом.
Дело в том, что когда ваше приложение выполняет HTTPS-запрос к сайту, оно сначала должно пройти через прокси-сервер Charles (не забудьте, что это прокси-сервер!). В этот момент Чарльз подключается к сайту https с помощью открытого ключа сайта для шифрования и дешифрования данных, как если бы это был обычный браузер или приложение.
Таким образом, в этот момент Чарльз получает ответ от вашего https-запроса в незашифрованном виде, и его необходимо передать в ваше приложение, но ваше приложение ожидает зашифрованные данные, поэтому Чарльз должен снова зашифровать его, чтобы ваше приложение (т. Е. Ваш браузер) не пожаловаться на незашифрованный https ответ. Для этого Чарльз использует свой собственный сертификат (пара открытый + закрытый ключ), шифрует ваши данные и отправляет их обратно в ваше приложение.
Наконец, ваше приложение получает эти данные в зашифрованном виде от Чарльза. Ваше приложение не будет знать, как его расшифровать, если вы не предоставите ему открытый ключ сертификата (это делается путем "установки" сертификата на ваше приложение / браузер / устройство Android / и т. Д.).
Вот как я думаю, что все прокси SSL работает с Чарльзом.
Было бы здорово, если бы кто-то мог поспособствовать этому ответу!
То, что делает Чарльз, - это, по сути, атака «Человек посередине» . Вот почему вам необходимо установить его сертификат на устройство, которое вы используете.
Обычно, когда устройство и сервер обмениваются данными через ssl / tls, запрос и ответы шифруются с использованием сертификата сервера. Это означает, что кто-то, кто перехватывает трафик, не может его прочитать, поскольку он зашифрован сертификатом сервера. Но поскольку вы установили сертификат Чарльза (то есть ваше устройство доверяет ему) на свое устройство и настроили его для связи с сервером через прокси-сервер, Чарльз может расшифровать трафик.
Шаги будут выглядеть так:
- клиент и сервер обмениваются ключами (однако, поскольку Чарльз находится посередине, они обмениваются ключами с Чарльзом)
- клиент отправляет зашифрованный запрос на сервер (однако он использует ключ от Чарльза)
- Чарльз перехватывает запрос
- Чарльз расшифровывает запрос и вот что вы видите
- Чарльз шифрует запрос ключом сервера
- Чарльз отправляет его на сервер
То же самое и с ответами.