HTTPS и TLS
HTTPS (HTTP поверх зашифрованных TLS-соединений) — это стандартный способ выполнения HTTP-запросов в
HTTPS (HTTP-запросы через зашифрованные TLS-соединения) — это стандартный способ выполнения HTTP-запросов в интернете, обеспечивающий безопасность, целостность и конфиденциальность данных. При использовании обратного прокси-сервера, такого как YARP, необходимо учитывать ряд особенностей, связанных с HTTPS/TLS.
Завершение TLS
YARP — это HTTP-прокси уровня 7 (L7), что означает, что входящие HTTPS/TLS-соединения полностью расшифровываются прокси-сервером, чтобы он мог обрабатывать и пересылать HTTP-запросы. Это обычно называется завершением TLS (TLS termination). Исходящие соединения с узлами назначения могут быть зашифрованы или нет — в зависимости от предоставленной конфигурации.
Туннелирование TLS (CONNECT)
Туннелирование TLS с использованием метода CONNECT — это функция, позволяющая проксировать запросы без их расшифровки. YARP её не поддерживает, и добавлять такую поддержку в планах нет.
Настройка входящих подключений
YARP может работать поверх любого сервера ASP.NET Core, а настройка HTTPS/TLS для входящих подключений зависит от конкретного сервера. Сведения о настройке см. в документации по Kestrel, IIS и Http.Sys.
Дополнительные фильтры TLS в Kestrel
Kestrel поддерживает перехват входящих подключений до выполнения TLS-рукопожатия. В состав YARP входит API TlsFrameHelper, который умеет разбирать необработанные данные TLS-рукопожатия и позволяет собирать пользовательскую телеметрию или заранее отклонять подключения. Эти API не могут изменять TLS-рукопожатие или расшифровывать поток данных. См. этот пример .
Настройка исходящих подключений
Чтобы включить шифрование TLS при обращении к узлу назначения, укажите адрес узла назначения по схеме https, например "https://destinationHost" . Примеры см. в документации по настройке.
Имя узла, указанное в адресе назначения, по умолчанию используется для TLS-рукопожатия,
включая SNI и проверку сертификата сервера. Если включена пересылка исходного заголовка host,
то для TLS-рукопожатия вместо этого будет использовано значение из него. Если требуется
использовать другое значение узла, воспользуйтесь преобразованием RequestHeader, чтобы задать заголовок host.
Исходящие подключения к узлам назначения обрабатываются с помощью HttpClient/SocketsHttpHandler. Для каждого кластера можно настроить отдельный экземпляр и собственные параметры. Некоторые параметры доступны в модели конфигурации, тогда как другие можно задать только в коде. Подробности см. в документации по HttpClient.
Сертификаты серверов назначения должны быть доверенными для прокси-сервера, либо через конфигурацию HttpClient необходимо применить пользовательскую проверку.
Эта статья создана автором с использованием ИИ. Подробнее