2016-11-08 3 views
2

У меня есть способ загрузки в C#. Метод отправляет запрос на URL-адрес для загрузки. Но это дает ошибку для некоторого URL-адреса. У последнего URL-адреса, с которым я столкнулся, является exe-файл link.Исключение защищенного канала SSL/TSL при отправке HttpWebRequest

Мой метод:

void DownloadProcedure() 
    { 

     #region Request-Response 

     req = WebRequest.Create(url) as HttpWebRequest; 
     req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"; 
     req.AllowAutoRedirect = true; 
     req.MaximumAutomaticRedirections = 5; 
     req.ServicePoint.ConnectionLimit += 2; 
     req.ServicePoint.Expect100Continue = true; 
     req.ProtocolVersion = HttpVersion.Version10; 
     ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls 
      | SecurityProtocolType.Tls11 
      | SecurityProtocolType.Tls12 
      | SecurityProtocolType.Ssl3; 
     // allows for validation of SSL conversations 
     ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 
     if (rangeAllowed) 
      req.AddRange(from, to); 
     resp = req.GetResponse() as HttpWebResponse; 

     #endregion 

     //...bla bla... 
    } 

В этом коде на GetResponse() линии он бросает Не удалось создать SSL/TSL безопасный канал. Но он не бросает его всегда. Иногда файл загружается успешно, и иногда он генерирует это исключение. Я не знаю, как правильно пройти через это.

Так как я могу исправить эту проблему

+0

Во-первых, эта строка должна быть только для отладки. ServicePointManager.ServerCertificateValidationCallback = delegate {return true; }; Пожалуйста, не вводите этот код в производство. – granadaCoder

+1

Используйте этот код, чтобы посмотреть на соответствующий сертификат. ServicePointManager.ServerCertificateValidationCallback = новый System.Net.Security.RemoteCertificateValidationCallback (( отправитель, серт, цепь, SSL) => { Console.WriteLine ("ServerCertificateValidationCallback для Cert.Subject: '{0}'", cert.Subject); System.Net.HttpWebRequest ГВР = отправитель, как System.Net.HttpWebRequest; если (нуль = ГВР) { SecurityShower.ShowHttpWebRequest (ГВР); }! SecurityShower.ShowCertAndChain (cert, chain); return true; }); – granadaCoder

+0

Вы можете получить код ShowCertAndChain здесь: https://granadacoder.wordpress.com/2016/11/04/service-bus-and-custom-self-signed-certificates-with-a-high-availabilitymultiplecomputing-nodes -in-the-farm/ – granadaCoder

ответ

0

Если вы столкнулись с этой проблемой для различных URLs:? Вы вынуждаете Http 1.0. В настоящее время доступны Http 1.0, 1.1 и 2. Можете ли вы не ограничивать себя Http 1.0. Также некоторые серверы по-прежнему используют старые версии SSL, поэтому вы можете добавить поддержку для них ...

+0

Используйте более старый, чем SSL3 - вы шутите правильно? –

+0

Я не рекомендую использовать версию «Heart Bleed Version», о которой я только что упомянул, может быть неудачный url использует более старые версии. Он внедряет клиент, а не сервер ... – efaruk

0

Я не уверен в диагностике конкретной проблемы из кода, который вы опубликовали, но я думаю, вы можете сделать больше общий вопрос о том, насколько конкретным является ваш WebRequest. Нет никаких гарантий относительно того, какие сертификаты, протоколы или шифраторы включены на каком-либо конкретном удаленном сервере. или есть ли какие-либо гарантии относительно того, что включено или запрещено на компьютере, на котором запущен ваш код.

В частности, я видел подобные ошибки, когда параметры реестра на вашем собственном сервере предотвращают соединение.

SSL3 is broken, и если у вас есть веская причина (то есть конкретный сайт, к которому вам нужно обратиться), я бы поставил под вопрос, почему вы явно хотите его поддержать. Это interesting blog от 2 лет назад предполагает, что 98,7% сайтов поддерживают TLS1.0.

Если у вас есть веские причины не описанные в оригинальной почте, почему бы не просто сделать что-то вроде:

Uri uri = new Uri(url); 
if (uri.Scheme != "https") 
    throw new ArgumentException("must use https"); 

WebRequest webRequest = WebRequest.Create(uri); 
WebResponse webResponse = webRequest.GetResponse(); 

Тогда доказательство против будущих изменений, как и в день (надеюсь, долгое время теперь), когда TLS нарушена и устарела. Также любые изменения, такие как требование TLS1.2 или полностью удаление сайтов SSLv3, могут быть выполнены путем изменения настроек на главной машине, а не для повторного развертывания кода.

 Смежные вопросы

  • Нет связанных вопросов^_^