Не удалось создать безопасный канал 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:
Чем я ошибаюсь? Почему я не могу подключиться к этому серверу (который имеет недействительный самозаверяющий сертификат)
Ответы
Ответ 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 для получения более подробной информации.