Opt-In Software Blog

Software, dvelopment, and practical insights

Расшифровка SSL/TLS-трафика в ProxyMapService

Читать на другом языке: English | Русский

Большая часть веб-трафика сегодня шифруется с помощью HTTPS. Шифрование защищает данные при передаче, но одновременно не позволяет прокси просматривать сами HTTP-запросы и ответы.

Это становится важным, когда от ProxyMapService требуется нечто большее, чем простая пересылка. Например, для кэширования статического содержимого — изображений, JavaScript-файлов, таблиц стилей, шрифтов и других ресурсов — необходим доступ к расшифрованной HTTP-нагрузке. Без расшифровки SSL/TLS прокси видит лишь зашифрованный поток байтов и не может ни анализировать, ни кэшировать содержимое.

ProxyMapService поддерживает расшифровку SSL/TLS-трафика, работая как прокси «человек посередине» (MITM). Это позволяет просматривать, изменять, кэшировать и маршрутизировать HTTPS-трафик с помощью того же движка правил, который доступен для обычного HTTP-трафика.

В ProxyMapService уже есть поддержка кэширования содержимого, но эта тема заслуживает отдельной статьи. В этой публикации мы сосредоточимся только на расшифровке SSL/TLS и настройке сертификатов, необходимой для её работы.

Создание сертификата корневого центра сертификации

Прежде чем ProxyMapService сможет расшифровывать HTTPS-трафик, он должен уметь динамически генерировать сертификаты для целевых хостов. Для этого нужен доверенный сертификат корневого центра сертификации (CA).

Проще всего создать его с помощью консольной утилиты CreateRootCA, входящей в состав ProxyMapService.

По умолчанию утилита создаёт файлы сертификата в каталоге .proxymap в домашней папке текущего пользователя.

Создаются следующие файлы:

  • файл PKCS#12 (.p12), содержащий сертификат и закрытый ключ;
  • открытый сертификат (.cer);
  • открытый сертификат в формате PEM (.pem).

Установка сертификата

Созданный сертификат необходимо установить в соответствующее хранилище сертификатов Windows.

Автономный режим

Если ProxyMapService запущен как автономное приложение (ProxyMapService.exe), установите корневой сертификат в хранилище Доверенные корневые центры сертификации (Trusted Root Certification Authorities) для текущего пользователя.

Откройте диспетчер сертификатов:

certmgr.msc

Затем импортируйте созданный корневой сертификат в:

Current User
 └─ Trusted Root Certification Authorities

Размещение в IIS

Если ProxyMapService размещён в IIS, установите сертификат в хранилище Личные (Personal) для локального компьютера.

Откройте:

certlm.msc

Затем импортируйте сертификат в:

Local Computer
 └─ Personal

У учётной записи, от имени которой работает пул приложений, должен быть доступ к закрытому ключу сертификата.

Настройка корневого сертификата

После установки сертификата необходимо настроить ProxyMapService так, чтобы он мог его найти.

Пример конфигурации:

"SslServerOptions": {
    "EnabledSslProtocols": "Tls11,Tls12,Tls13",
    "ClientCertificateRequired": false,
    "CheckCertificateRevocation": false,
    "CACertificate": {
        "StoreLocation": "LocalMachine",
        "StoreName": "My",
        "Subject": "CN=DO_NOT_TRUST_ProxyMapRoot"
    }
}

В этом примере ProxyMapService ищет сертификат со следующим субъектом:

CN=DO_NOT_TRUST_ProxyMapRoot

в хранилище My (Личные) в расположении Local Machine (локальный компьютер).

Параметры SslServerOptions

SslServerOptions определяет поведение ProxyMapService в роли TLS-сервера по отношению к подключающимся клиентам.

EnabledSslProtocols

Указывает, какие версии протокола TLS разрешены.

"EnabledSslProtocols": "Tls11,Tls12,Tls13"

При согласовании TLS будут приниматься только перечисленные версии протокола.

В большинстве окружений достаточно TLS 1.2 и TLS 1.3. TLS 1.1 обычно включают только ради совместимости со старыми клиентами.

ClientCertificateRequired

Определяет, должен ли клиент предъявлять сертификат во время TLS-handshake.

"ClientCertificateRequired": false

При значении false клиенты аутентифицируются по стандартной схеме HTTPS.

При значении true требуется взаимная аутентификация TLS (mTLS), и клиенты обязаны предоставить действительный сертификат.

CheckCertificateRevocation

Управляет проверкой отзыва сертификатов.

"CheckCertificateRevocation": false

Если проверка включена, Windows выполняет онлайн-проверку отзыва через точки распространения CRL или OCSP при валидации сертификата.

Отключение проверки отзыва может уменьшить задержку при установке соединения и избавить от сбоев в изолированных окружениях, где службы проверки отзыва недоступны.

CACertificate

Указывает корневой сертификат CA, который ProxyMapService использует для генерации сертификатов для перехватываемых HTTPS-хостов.

Сертификат определяется с помощью:

  • StoreLocation
  • StoreName
  • Subject

Для успешного перехвата SSL/TLS необходим закрытый ключ, связанный с этим сертификатом.

Параметры SslClientOptions

SslClientOptions определяет, как ProxyMapService аутентифицируется при подключении к вышестоящим HTTPS-серверам.

Пример конфигурации:

"SslClientOptions": {
    "EnabledSslProtocols": "Tls11,Tls12,Tls13",
    "CheckCertificateRevocation": false
}

EnabledSslProtocols

Указывает, какие версии протокола TLS ProxyMapService может использовать при установке исходящих HTTPS-соединений.

"EnabledSslProtocols": "Tls11,Tls12,Tls13"

При согласовании с удалённым сервером будут предлагаться только настроенные протоколы.

CheckCertificateRevocation

Управляет проверкой отзыва сертификатов, предъявляемых вышестоящими серверами.

"CheckCertificateRevocation": false

Если проверка включена, статус отзыва сертификата проверяется до того, как сертификат сервера будет принят.

Это помогает выявлять сертификаты, отозванные выдавшим их центром сертификации.

Включение расшифровки SSL/TLS

После того как сертификат установлен, а параметры SSL настроены, расшифровку SSL/TLS можно включить с помощью параметра DecryptSSL.

Расшифровку можно включить глобально для порта прослушивания или выборочно для отдельных правил хостов.

Включение расшифровки на порту прослушивания

Пример:

"Listen": {
    "Port": 10001,
    "RejectHttpProxy": false,
    "DecryptSSL": true
}

При такой конфигурации весь HTTPS-трафик, поступающий на порт 10001, будет расшифровываться и обрабатываться ProxyMapService.

Обычно это самая простая конфигурация, когда нужно проверять весь трафик, приходящий на данный слушатель.

Включение расшифровки для отдельных хостов

Иногда расшифровывать нужно лишь часть HTTPS-трафика.

В таком случае расшифровку можно включить в правилах хостов.

Пример:

"HostRules": {
    "Items": [
        {
            "Pattern": "google\\.com$",
            "HostPort": 443,
            "DecryptSSL": true
        }
    ]
}

В этой конфигурации будет расшифровываться только HTTPS-трафик, соответствующий google.com на порту 443.

Весь остальной HTTPS-трафик продолжит проходить без перехвата.

Такой подход удобен, когда проверка SSL нужна только для избранных адресов назначения.

Проверка конфигурации

После включения расшифровки SSL/TLS:

  1. Запустите ProxyMapService.
  2. Настройте браузер или приложение на использование прокси.
  3. Откройте HTTPS-сайт.
  4. Убедитесь, что предупреждений о сертификате не появляется.
  5. Проверьте журналы ProxyMapService и убедитесь, что расшифрованные HTTP-запросы и ответы обрабатываются.

Если появляются предупреждения о сертификате, проверьте, что:

  • корневой сертификат CA установлен в правильное хранилище сертификатов;
  • настроенный субъект сертификата совпадает с установленным сертификатом;
  • у сертификата есть закрытый ключ;
  • у учётной записи службы есть разрешение на доступ к закрытому ключу.

Заключение

Расшифровка SSL/TLS — необходимое условие для расширенной обработки HTTPS-трафика в ProxyMapService. Как только доверенный корневой сертификат CA установлен и настроен, служба может проверять зашифрованный трафик так же, как обычный HTTP-трафик.

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

Search