2017-03-18 66 views
1

我已經得到了與C#和一個簡單的HTTPS請求一個問題...C#信息:System.Net.WebException在簡單HTTPS請求

我想請求這個網址:https://api.sipgate.com/v1/在它工作正常一個網頁瀏覽器,但我的C#-Code不工作:(有沒有人一個想法,我做錯了什麼謝謝

using System.Net; 
using System.IO; 

// [...] 

WebRequest req = WebRequest.Create("https://api.sipgate.com/v1"); 
req.ContentType = "application/json"; 

try { 
    WebResponse res = req.GetResponse(); // Exception here... 
    Stream content = res.GetResponseStream(); 
    Console.WriteLine((new StreamReader(content)).ReadToEnd()); 
} catch (Exception e) { 
    Console.WriteLine(e.ToString());     
} 

這裏是例外:?!

System.Net.WebException: Die zugrunde liegende Verbindung wurde geschlossen: Unerwarteter Fehler beim Senden.. ---> System.IO.IOException: Fehler bei Authentifizierung, da die Gegenseite den Transportstream geschlossen hat. 
    bei System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) 
    bei System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) 
    bei System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest) 
    bei System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult) 
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    bei System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result) 
    bei System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size) 
    bei System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size) 
    bei System.Net.ConnectStream.WriteHeaders(Boolean async) 
    --- Ende der internen Ausnahmestapelüberwachung --- 
    bei System.Net.HttpWebRequest.GetResponse() 
    bei Sipgate_Test.Program.Main(String[] args) in c:\users\abc\documents\visual studio 2017\Projects\def\hij\Program.cs:Zeile 24. 

System.Net.WebException: 由於另一方關閉了傳輸流,因此身份驗證錯誤。

回答

3

您缺少對SSL的支持。

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 

using (WebClient Client = new WebClient()) 
    string Content = Client.DownloadString("https://api.sipgate.com/v1"); 

編輯: 感謝您的指點在這@Crowcoder。在生產環境中,您不應該接受沒有驗證的任何證書。 ServerCertificateValidationCallback提供了一種訪問您通常無法訪問的SSL證書信息的方法。 例如,參數error會爲您提供特定的證書錯誤,如名稱不匹配。參數chain可以爲您提供服務器發送的確切證書鏈,當系統存儲缺少中間CA證書時,可用於構建證書鏈。

ServicePointManager.ServerCertificateValidationCallback += 
    (s, cert, chain, error) => 
{ 
    return error == SslPolicyErrors.None; 
}; 
+0

你不應該盲目地接受任何證書。 – Crowcoder

+0

謝謝,但這種新的代碼引發相同的異常: ServicePointManager.ServerCertificateValidationCallback + =(S,證書,鏈,錯誤)=> { 返回錯誤== SslPolicyErrors.None; }; ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; (WebClient w = new WebClient()){ string ctn = w.DownloadString(「https://api.sipgate.com/v1」); Console.WriteLine(ctn); } – user3422533

+0

我上面更新了我的解決方案,它適用於我的本地機器。 :) –

0

您可以使用ServicePointManager檢查證書並驗證它是你所期望的一個,通過指紋或主題名稱,例如。

但是,如果您信任該站點,則通常會在服務器上安裝證書。

在Chrome開發工具安全選項卡中,您可以下載證書,然後將其安裝在服務器上。您需要鏈接上的所有證書,如Certification Path選項卡上所示。

enter image description here