it-roy-ru.com

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

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

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

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: 

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

48
Marcin Konrad Ceglarek

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

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

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

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

В качестве продолжения для тех, кто все еще сталкивается с этим - я добавил параметры 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, если нет другой альтернативы. 

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

11
Jeff Lindborg

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

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

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

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

переместите эту строку: ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Перед этой строкой: HttpWebRequest request = (HttpWebRequest) WebRequest.Create (uri);

Исходное сообщение: обновление безопасности KB4344167 ломает код TLS

0
user2686690

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

Windows® 8

Чтобы очистить кэш DNS, если вы используете Windows 8, выполните следующие действия:

На клавиатуре нажмите Win + X, чтобы открыть меню WinX.

Щелкните правой кнопкой мыши командную строку и выберите «Запуск от имени администратора».

Запустите следующую команду:

ipconfig/flushdns

Если команда выполнена успешно, система возвращает следующее сообщение:

Конфигурация Windows IP успешно сбросила кэш DNS Resolver.

Windows® 7

Чтобы очистить кэш DNS, если вы используете Windows 7, выполните следующие действия:

Нажмите Пуск.

Введите cmd в текстовое поле поиска меню «Пуск».

Щелкните правой кнопкой мыши командную строку и выберите «Запуск от имени администратора».

Запустите следующую команду:

ipconfig/flushdns

Если команда выполнена успешно, система возвращает следующее сообщение: Конфигурация IP-адреса Windows успешно сбросила кэш DNS Resolver.

0
Aviva

Я наткнулся на эту тему, потому что у меня также была ошибка Не удалось создать безопасный канал SSL/TLS. В моем случае я пытался получить доступ к API-интерфейсу конфигурации REST Siebel из PowerShell с помощью Invoke-RestMethod, и ни одно из приведенных выше предложений не помогло. 

В конце концов я наткнулся на причину своей проблемы: сервер, с которым я связывался, потребовал аутентификацию сертификата клиента.

Чтобы звонки работали, мне пришлось предоставить сертификат клиента (включая закрытый ключ) с параметром -Certificate:

$Pwd = 'certificatepassword'
$Pfx = New-Object -TypeName 'System.Security.Cryptography.X509Certificates.X509Certificate2'
$Pfx.Import('clientcert.p12', $Pwd, 'Exportable,PersistKeySet')
Invoke-RestMethod -Uri 'https://your.rest.Host/api/' -Certificate $Pfx -OtherParam ...

Надеюсь, мой опыт может помочь кому-то, кто имеет мой особый вкус этой проблемы.

0
paulf