Запрос был прерван: не удалось создать безопасный канал SSL / TLS - PullRequest
302 голосов
/ 18 мая 2010

Мы не можем подключиться к HTTPS-серверу, используя WebRequest из-за этого сообщения об ошибке:

The request was aborted: Could not create SSL/TLS secure channel.

Мы знаем, что на сервере нет действительного сертификата HTTPS с использованным путем, но для обхода этой проблемы мы используем следующий код, который мы взяли из другого сообщения StackOverflow:

private void Somewhere() {
    ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(AlwaysGoodCertificate);
}

private static bool AlwaysGoodCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors) {
   return true;
}

Проблема в том, что сервер никогда не проверяет сертификат и не работает с вышеуказанной ошибкой. Кто-нибудь знает, что мне делать?


Я должен упомянуть, что мы с коллегой провели тесты несколько недель назад, и они работали нормально с чем-то похожим на то, что я написал выше. Единственное «основное отличие», которое мы обнаружили, заключается в том, что я использую Windows 7, а он - Windows XP. Это что-то меняет?

Ответы [ 36 ]

1 голос
/ 06 апреля 2018

Это исправлено для меня, добавьте сетевой сервис к разрешениям. Щелкните правой кнопкой мыши сертификат> Все задачи> Управление закрытыми ключами> Добавить> Сетевая служба

0 голосов
/ 10 мая 2019

У меня был сертификат в магазине и в архиве. Я попытался соединиться с файлом и получил это сообщение об ошибке. Когда я использовал тот в магазине, он работал. Я думаю, что какой-то конфликт возник из-за того, что сертификат был в хранилище, когда я хотел использовать тот, который в файле. (Другой сервис на той же машине использовал сертификат в хранилище, и я разработал другой сервис, используя сертификат в файле. Работал как чудо на dev до тестирования).

0 голосов
/ 30 апреля 2019

Ни один из ответов не сработал для меня.

Вот что сработало:

Вместо инициализации моего X509Certifiacte2 вот так:

   var certificate = new X509Certificate2(bytes, pass);

Я сделал это так:

   var certificate = new X509Certificate2(bytes, pass, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);

Обратите внимание на X509KeyStorageFlags.Exportable !!

Я не изменил остальную часть кода (сам WebRequest):

// I'm not even sure the first two lines are necessary:
ServicePointManager.Expect100Continue = true; 
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

request = (HttpWebRequest)WebRequest.Create(string.Format("https://{0}.sii.cl/cvc_cgi/dte/of_solicita_folios", server));
request.Method = "GET";
request.Referer = string.Format("https://hercules.sii.cl/cgi_AUT2000/autInicio.cgi?referencia=https://{0}.sii.cl/cvc_cgi/dte/of_solicita_folios", servidor);
request.UserAgent = "Mozilla/4.0";
request.ClientCertificates.Add(certificate);
request.CookieContainer = new CookieContainer();

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    // etc...
}

На самом деле я даже не уверен, что первые две строки необходимы ...

0 голосов
/ 09 июля 2018

Если вы не хотите, не можете легко или не можете быстро исправить свой код, вместо этого вы можете принудительно использовать TLS 1.2 с помощью своего кода .NET в рамках.

Это не мое приложение, но оно помогло исправить наше старое приложение .NET 4.5 (работающее на Server 2008r2), чтобы снова работать с Paypal Payflow Gateway. Должно быть, они начали форсировать соединения с TLS 1.2 по обратным вызовам шлюза потока платежей в период с 6/25/18 по 7/8/18.

Детали: https://github.com/TheLevelUp/pos-tls-patcher Загрузить: https://github.com/TheLevelUp/pos-tls-patcher/releases

0 голосов
/ 06 июля 2018

Я недавно столкнулся с той же проблемой. Моя среда работает под .NET 4.6.1 с VB.NET. Вот как я это исправил:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3
ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf util.ValidateServerCertificate)

и функция util.ValidateServerCertificate:

Public Function ValidateServerCertificate(ByVal sender As Object, ByVal certificate As X509Certificate, ByVal chain As X509Chain, ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
    Return True
End Function
0 голосов
/ 17 ноября 2017

. По умолчанию .NET ServicePointManager.SecurityProtocol использует SSLv3 и TLS. Если вы обращаетесь к серверу Apache, существует переменная конфигурации с именем SSLProtocol, которая по умолчанию TLSv1.2. Вы можете настроить ServicePointManager.SecurityProtocol на использование соответствующего протокола, поддерживаемого вашим веб-сервером, или изменить конфигурацию Apache, чтобы разрешить все протоколы, подобные этому SSLProtocolall.

...