2017-02-23 65 views
7

Есть много сообщений о SO об этом, и я просмотрел их, но до сих пор нет решения. Я надеюсь, что кто-то может указать мне в правильном направлении.SoapHttpClientProtocol и TLS 1.2 - Клиент и сервер не могут обмениваться данными, потому что у них нет общего алгоритма

Теперь у нас есть требование использовать TLS 1.2 для подключения к удаленному провайдеру. Таким образом, я установил Windows Server 2016 и настроил его по мере необходимости:

enter image description here enter image description here

Я знаю, что удаленный сервер TLS 1.2 и что он поддерживает подсвеченный шифр.

Мы подключаемся к удаленной конечной точке с использованием прокси-класса C#, сгенерированного WSDL, предоставленного провайдером, - до того, как они преобразуют свой конец в TLS (System.Web.Services.Protocols.SoapHttpClientProtocol).

Когда я подключаюсь с использованием прокси-сервера, я получаю исключение с внутренним исключением: «Клиент и сервер не могут общаться, потому что у них нет общего алгоритма».

Я не вижу нигде, что ServicePointManager.SecurityProtocol, поэтому я предполагаю, что .NET собирает TLS 1.2, поскольку он является единственным включенным протоколом? Не знаю, как это делает шифр.

Может ли кто-нибудь сказать мне, как я пытаюсь это исправить? Если возможно, я не хочу регенерировать прокси-класс WSDL.

+2

В какой версии .NET Framework вы работаете? Как настроено ваше приложение? Что вы подразумеваете под «Я не вижу нигде этого ServicePointManager.SecurityProtocol»? Все это имеет решающее значение для поддержки TLS 1.2: http: // stackoverflow.com/вопросы/28286086/default-securityprotocol-in-net-4-5/28502562 # 28502562 –

ответ

9

Если ваше клиентское приложение было скомпилировано против .NET Framework 4.5.2 или ниже, то по умолчанию ServicePointManager.SecurityProtocol инициализируется SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls (только для SSL 3.0 и TLS 1.0), поэтому он не сможет подключиться к удаленному серверу что требует TLS 1.2.

Есть несколько способов, чтобы позволить клиентскому приложению использовать TLS 1.2:

  • перекомпилировать клиентское приложение на .NET Framework 4.6 или более позднюю версию. (В Visual Studio откройте страницы свойств вашего проекта, перейдите на вкладку «Приложение» и измените целевую структуру.)
  • На клиентской машине запустите RegEdit.exe, перейдите к HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319, добавьте DWORD (32-разрядный) значение имени SchUseStrongCrypto, и установите его в 1.
  • Когда клиентское приложение запускается, включите TLS 1.2 (Этот флаг вызывает ServicePointManager.SecurityProtocol быть инициализирована Tls | Tls11 | Tls12.): ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;

Там нет необходимости, чтобы восстановить ваш proxy, поскольку он не отвечает за ведение протокола TLS или шифрования.

+0

Perfect @Michael. Я уже сменил компиляцию на 4.6.1, но потом понял, что мне пришлось изменить httpFuntime targetFramework как 4.6.1, поскольку соединение было в конечном итоге сделано с помощью WebApi, который, как я считаю, устраняет изменение реестра? Выполнение изменения httpRuntime привело к подключению TLS 1.2. – TheEdge

0

У меня была проблема с удалением TLS 1.0 с веб-сайта, который подключался к веб-службе. Для меня это был httpRuntime, который застрял на 4.5.1 в web.config веб-службы. Служба была изменена на 4.6.1, изменив версию httpRuntime в файле web.config на 4.6.1, исправил проблему. Веб-сайт попытался настроить TLS на webservice и имеет только 1,2 и 1,1. Веб-служба поддерживала только 1,0, что вызвало ошибку.