Подтвердить что ты не робот

Не удалось создать безопасный канал SSL/TLS, несмотря на настройку ServerCertificateValidationCallback

Я пытаюсь установить соединение SSL/TLS с тестовым сервером с самозаверяющим сертификатом. Связь через небезопасный канал работала без проблем.

Вот мой пример кода, который я написал на основе этих решений: Разрешить ненадежные SSL-сертификаты с помощью HttpClient С# Игнорировать ошибки сертификата? Клиент .NET, подключающийся к веб-интерфейсу ssl

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

var c = new HttpClient();
var r = c.GetAsync("https://10.3.0.1:8443/rest/v1").Result;
if (r.IsSuccessStatusCode)
{
    Log.AddMessage(r.Content.Get<string>());
}
else
{
    Log.AddMessage(string.Format("{0} ({1})", (int)r.StatusCode, r.ReasonPhrase));
}

также пробовал это:

var handler = new WebRequestHandler();
handler.ServerCertificateValidationCallback = delegate { return true; };
var c = new HttpClient(handler);
...

и этот

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

но каждый раз, когда у меня есть исключение:

InnerException: System.Net.Http.HttpRequestException
   _HResult=-2146233088
   _message=An error occurred while sending the request.
   HResult=-2146233088
   IsTransient=false
   Message=An error occurred while sending the request.
   InnerException: System.Net.WebException
        _HResult=-2146233079
        _message=The request was aborted: Could not create SSL/TLS secure channel.
        HResult=-2146233079
        IsTransient=false
        Message=The request was aborted: Could not create SSL/TLS secure channel.
        Source=System
        StackTrace:
             at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
             at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
        InnerException: 

Чем я ошибаюсь? Почему я не могу подключиться к этому серверу (который имеет недействительный самозаверяющий сертификат)

4b9b3361

Ответ 1

Вы делаете это правильно с ServerCertificateValidationCallback. Это не проблема, с которой вы сталкиваетесь. Перед вами стоит проблема протокола SSL/TLS.

Например, если ваш сервер предлагает только SSLv3 и TLSv10, а вашему клиенту требуется TLSv12, вы получите это сообщение об ошибке. Что вам нужно сделать, так это убедиться, что на обоих клиентах и ​​серверах поддерживается общая версия протокола.

Когда мне нужен клиент, который может подключиться к как можно большему количеству серверов (а не быть как можно более безопасным), я использую это (вместе с настройкой обратного вызова проверки):

  ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Ответ 2

Так же, как и для тех, кто все еще работает в этом - я добавил параметры ServicePointManager.SecurityProfile, как указано в решении:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

И все же я продолжал получать то же самое "Запрос был прерван: не удалось создать безопасный канал SSL/TLS". Я пытался подключиться к некоторым старым голосовым серверам с интерфейсами API HTTPS SOAP (т.е. Голосовой почты, систем IP-телефонии и т.д.), Установленных несколько лет назад). Они поддерживают только SSL3-соединения, поскольку они были обновлены несколько лет назад.

Можно подумать, что включение SSl3 в список SecurityProtocols могло бы сделать трюк здесь, но это не так. Единственным способом, с помощью которого я мог заставить соединение, было включить ТОЛЬКО протокол Ssl3 и другие:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

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

В любом случае, если вы все еще сталкиваетесь с этим старым сайтом/сервером, его стоит попробовать.

Ответ 3

Мы решили такую ​​же проблему только сегодня, и все, что вам нужно сделать, это увеличить версию .NET.NET.

4.5.2 не работает для нас с указанной проблемой, а 4.6.1 в порядке

Если вам нужно сохранить версию .NET, установите

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Ответ 4

Если вы используете новое имя домена, и вы все это сделали, и вы по-прежнему получаете ту же ошибку, проверьте, очистите кеш DNS на своем ПК. Очистите DNS для получения более подробной информации.