Я поддерживаю довольно сложное приложение ASP.NET(настраиваемый NopCommerce 3.10).
Он должен подключаться к сторонним серверам через HTTPS в разных сценариях. Я делаю это через класс HttpWebRequest
.
Некоторые из этих серверов плохо настроены:
Один из сторонних серверов (например, Сервер A) требует тип протокола SSL3 и просто не работает соединение, если установлен другой тип протокола. Другой сервер (скажем Сервер B) предоставляет неверный сертификат, если соединение выполняется с SSL3. Точнее, он предоставляет сертификат с неправильным CN (общее имя). Однако, если я использую TLS с самого начала, сертификат в порядке.
Я решил проблему выше, используя обратный вызов ServicePointManager.ServerCertificateValidationCallback
, чтобы проверить политическую ошибку SSL.
Изменение протокола безопасности выполняется с помощью ServicePointManager.SecurityProtocol, который является статическим свойством. Однако запросы, выполняемые клиентами для моего приложения, которые запускают соединения HTTPS, описанные выше, могут выполняться параллельно в разных потоках.
Если я, например: установите протокол безопасности на нужный тип, выполните запрос HTTPS, а затем верните его для Server A, я не гарантирую, что если запрос в то же время нуждается для подключения к Серверу B не изменяется ServicePointManager.SecurityProtocol
на значение, отличное от значения, которое требуется Сервер A.
Я считаю, что это типичная многопоточная проблема со статическими переменными.
Из моего исследования я решил, что .NET не дает возможности использовать определенный протокол SSL для каждого экземпляра WebRequest.
Я думаю о таких решениях, как:
- очереди всех исходящих HTTPS-соединений внутри моего приложения для обеспечения надлежащего протокола SSL для каждого
- создание отдельного домена приложения для каждого запроса HTTPS (предлагается qaru.site/info/45923/...)
- изменить HTTPS-запрос на низкоуровневые TCP-соединения и обеспечить соблюдение различных протоколов SSL для каждого из них.
- создание прокси-приложения asp.net, которое будет останавливать исходящие запросы
Примечание. Очередь не будет огромным хитом производительности, потому что небольшой процент всех запросов клиентов действительно попадает в соответствующий код.
Однако вышеприведенные решения требуют сложного рефакторинга, учитывая архитектуру приложения или приблизительные обходные пути (третье решение)
Мой вопрос очень похож на на этот в msdn, однако, что он не получил удовлетворительных ответов.
Есть ли более прямой или эффективный способ обеспечения того, чтобы каждый запрос https использовал определенный протокол SSL?