Исключение C # при доступе к URL-адресу https через HttpWebRequest

#c# #.net #https

#c# #.net #https

Вопрос:

У меня есть следующий код :

  private string GetDataFromWeb(string url)
        {
            /*this taken according to other posts here 
            ServicePointManager.Expect100Continue = true;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
                | SecurityProtocolType.Tls11
                | SecurityProtocolType.Tls12
                | SecurityProtocolType.Ssl3;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) //exception occurs here 
            using (Stream stream = response.GetResponseStream())
            using (StreamReader reader = new StreamReader(stream))
            {
                var result = reader.ReadToEnd();
                Console.WriteLine("Finished read");
                return resu<
            }

        }
    
 

При вызове функции на каком-либо https-сайте (например https://api.stackexchange.com )
В строке, где вызывается GetResponse, происходит следующее исключение:

 Unhandled Exception: System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
 

Я также попытался, как рекомендовано в других сообщениях, обойти проверку ssl, выполнив следующий код (вызов при запуске приложения)

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(AlwaysGoodCertificate); .. где

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

Но все же исключение происходит

Работает в Windows 7, .net 4.5 Что-то не так в приведенном выше коде? При доступе к тому же сайту через Chrome или через приложение Nodejs (usinh fetch) — запрос выполнен успешно
Заранее спасибо

Комментарии:

1. В обновленной Windows 7 (пакет обновления 1 все обновления для системы безопасности, доступные до истечения срока службы) опубликованный вами код (даже если вы должны удалить все протоколы, кроме SecurityProtocolType.Tls12 ) не генерирует исключений. Вы также должны удалить ServicePointManager.Expect100Continue = true; : ваш код явно не обрабатывает это, но это другое дело — переопределение ServerCertificateValidationCallback не обходит проверку SSL , оно позволяет игнорировать неудачные проверки сертификатов сервера (использовать с осторожностью).

2. Обновите систему, установите . Net 4.8. Возможно, вам не хватает необходимых наборов шифров — обратите внимание, что в обновленной системе значение по ServicePointManager.SecurityProtocol умолчанию такое же, как в Windows 8 , SecurityProtocolType.SystemDefault , где должно быть значение по умолчанию TLS12 , с последними наборами шифров, установленными с обновлениями. Однако не самые последние наборы шифров. Некоторые сайты, использующие более строгую защиту , могут разрешать только самые последние наборы шифров, которые не включены в Windows 7 стандартными средствами (и никогда не будут). Веб-браузеры устанавливают и обрабатывают свои собственные наборы шифров.