Сертификат и MITM

Когда модулю нужен локальный сертификат, как он создаётся и устанавливается, что расшифровывается и что нет, и как его удалить.

Чтобы менять HTTPS-запросы, модуль должен их прочитать. Letakof делает это внутри VPN-туннеля и только для хостов из mitmHosts модуля: каждому хосту он предъявляет сертификат, выпущенный локальным центром сертификации (CA), который существует только на вашем iPhone. Это техника «человек посередине» (MITM), и она работает, только если вы установите этот CA и доверяете ему.

Сертификат не нужен для блокировки доменов (domainRules, domainSets) и для правил на обычном HTTP (порт 80). Он нужен только для HTTPS на порту 443. Установка сертификата сама по себе ничего не блокирует, а модуль без хостов ничего не расшифровывает.

Как создаётся сертификат

  • Его создаёт расширение VPN по команде приложения, поэтому сначала подключитесь.
  • Это корневой CA, уникальный для вашей установки: ECDSA P-256, действует один год, называется Letakof Local CA с коротким суффиксом. Сертификаты для отдельных хостов выпускаются на лету, на 24 часа.
  • Приватный ключ хранится в связке ключей iOS (Keychain), доступен только приложению и расширению, после первой разблокировки, только на этом устройстве и без синхронизации iCloud. Он никогда не записывается в файлы и журнал. Открытый сертификат хранится файлом в общем каталоге приложения.

Настройка

Откройте Настройки → Модули → Сертификат модулей. В заголовке показано состояние: Сертификат не создан, Создан, доверие не подтверждено или Создан, установлен и доверен, с отпечатком SHA-256 и сроком действия.

  1. Создать сертификат (VPN должен быть включён).
  2. Установить профиль в Safari. Letakof выдаёт профиль конфигурации (Letakof Local CA, только открытый сертификат, его можно удалить) с одноразового адреса на вашем же устройстве и открывает его в Safari. Разрешите загрузку и установите профиль в Настройки → Основные → VPN и управление устройством.
  3. Включите полное доверие в Настройки → Основные → Об устройстве → Доверие сертификатов → Letakof Local CA.
  4. Проверить доверие (VPN должен быть включён). Letakof обращается через расширение VPN к служебному имени и сверяет отпечаток. Если сертификат не доверен, приложение предложит установить профиль и включить полное доверие.

Системные окна в шагах 2 и 3 принадлежат iOS и в вашей версии могут выглядеть иначе.

Что расшифровывается

Только TCP-соединения на портах 443 и 80 к хостам из mitmHosts включённых модулей, кроме excludedHosts и хостов, которые вы исключили сами. Всё остальное остаётся в исходном шифровании.

Имя хоста должно быть известно: из соединения или его SNI. Если оно неизвестно (например, подмена DNS), соединение не расшифровывается, а модуль показывает Имя узла недоступно.

Что перехватить нельзя:

  • Приложения с certificate pinning отклоняют подменный сертификат. Обойти это нельзя.
  • QUIC и другой UDP. UDP на порт 443 хоста модуля отклоняется локально, чтобы приложение перешло на TCP.
  • WebSocket и Upgrade проходят без изменений, как и видео, аудио, потоки событий и gRPC.

Соединение с настоящим сервером идёт по обычному маршруту профиля и проверяется полностью; цепочка, опирающаяся на локальный CA, отвергается. Установленный CA не обходит защиту серверов и не даёт доступа к вашим аккаунтам.

Если приложение отказалось от подменного сертификата, модуль показывает TLS несовместим. Диагностика хостов перечисляет хосты, а Не расшифровывать исключает хост для следующих соединений.

Как отключить и удалить

  • Выключите модуль или все модули — расшифровка прекратится. Один сертификат ничего не расшифровывает.
  • Удалить сертификат убирает ключ из Keychain. Затем удалите профиль сами в Настройки → Основные → VPN и управление устройством. После переустановки приложения экран покажет Не создан, а старый профиль тоже нужно удалить вручную.

Прочитайте перед включением модуля

Сертификат нужен только чтобы читать и менять HTTPS-запросы тех хостов, которые вы разрешили модулями. Ключ создаётся на устройстве и не покидает iPhone. Скрипт модуля видит заголовки, cookie и тела этих запросов. Устанавливайте только модули, код которых вы прочитали: адрес источника, имя автора и SHA-256 не доказывают авторство.

Нашли ошибку? Создайте обращение на GitHub.