Большая часть веб-трафика сегодня шифруется с помощью 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-хостов.
Сертификат определяется с помощью:
StoreLocationStoreNameSubject
Для успешного перехвата 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:
- Запустите ProxyMapService.
- Настройте браузер или приложение на использование прокси.
- Откройте HTTPS-сайт.
- Убедитесь, что предупреждений о сертификате не появляется.
- Проверьте журналы ProxyMapService и убедитесь, что расшифрованные HTTP-запросы и ответы обрабатываются.
Если появляются предупреждения о сертификате, проверьте, что:
- корневой сертификат CA установлен в правильное хранилище сертификатов;
- настроенный субъект сертификата совпадает с установленным сертификатом;
- у сертификата есть закрытый ключ;
- у учётной записи службы есть разрешение на доступ к закрытому ключу.
Заключение
Расшифровка SSL/TLS — необходимое условие для расширенной обработки HTTPS-трафика в ProxyMapService. Как только доверенный корневой сертификат CA установлен и настроен, служба может проверять зашифрованный трафик так же, как обычный HTTP-трафик.
Эта возможность открывает такие сценарии, как проверка запросов, изменение ответов, анализ трафика, выборочная маршрутизация и кэширование содержимого. В одной из следующих публикаций мы подробнее рассмотрим подсистему кэширования и то, как с её помощью можно эффективно отдавать статическое содержимое прямо из ProxyMapService.