2016-11-08 92 views
2

我在C#中有一個下載方法。該方法向要下載的URL發送請求。但是它給一些URL地址提供了錯誤。我遇到問題的最後一個URL是一個exe文件link發送HttpWebRequest時SSL/TSL安全通道異常

我的方法:

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 =委託{return true; };請勿將此代碼投入生產。 – granadaCoder

+1

使用此代碼查看有問題的證書。 ServicePointManager.ServerCertificateValidationCallback = 新System.Net.Security.RemoteCertificateValidationCallback(( 發件人, 證書, 鏈, SSL)=> { Console.WriteLine( 「ServerCertificateValidationCallback爲Cert.Subject: '{0}'」, cert.Subject); System.Net.HttpWebRequest HWR =發送者作爲System.Net.HttpWebRequest; 如果(空= HWR) { SecurityShower.ShowHttpWebRequest(HWR); }! SecurityShower。ShowCertAndChain(cert,chain); 返回true; }); – granadaCoder

+0

您可以在此處獲取ShowCertAndChain代碼:https://granadacoder.wordpress.com/2016/11/04/service-bus-and-custom-self-signed-certificates-with-a-high-availabilitymultiple-computing-nodes在農場/ – granadaCoder

回答

0

如果您遇到此問題的其他網址: 您強制HTTP 1.0。確實,Http 1.0,1.1和2.可用。你可以不要限制你的自我與Http 1.0。 也有些服務器仍然使用舊的SSL版本,所以你可能想要添加對它們的支持...

+0

使用比SSL3更舊的版本 - 您是在開玩笑吧? –

+0

我不推薦使用我剛剛提到的「心臟出血版本」,可能會失敗的網址使用舊版本。他正在實施客戶端而不是服務器...... – efaruk

0

我不確定從你發佈的代碼診斷特定問題,但我認爲你可以做出更多關於你的WebRequest是如何具體的一般觀點。無法保證在任何特定的遠程服務器上啓用了哪些證書,協議或密碼套件也不是是否對運行代碼的計算機上啓用或限制的內容有任何保證。

特別是我看到類似的錯誤,當你自己的服務器上的註冊表設置阻止連接。

SSL3 is broken除非你有一個很好的理由(即你需要訪問的特定網站),那麼我會質疑你爲什麼明確支持它。這兩年前的interesting blog表明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站點的更改都可以通過更改主機上的設置來完成,而不是重新部署代碼。