2012-06-27 212 views
19

我試圖通過SSL發出請求。證書已經安裝在機器上,它通過瀏覽器工作。錯誤:C#底層連接已關閉:無法建立SSL/TLS安全通道的信任關係

我使用這個請求:

System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
byte[] data = encoding.GetBytes(request.Content.OuterXml.ToString()); 
string password = "XXXX"; 
X509Certificate2 cert = new X509Certificate2("c:\\zzzz.p12", password); 
string key = cert.GetPublicKeyString(); 
string certData = Encoding.ASCII.GetString(cert.Export(X509ContentType.Cert)); 

Uri uri = new Uri(request.Url); 
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(uri); 
myRequest.Credentials = new NetworkCredential(request.User, request.Password.ToString()); 
myRequest.Method = "PUT"; 
myRequest.ContentType = request.ContentType; 
myRequest.ContentLength = data.Length; 
myRequest.ClientCertificates.Add(cert); 

Stream newStream = myRequest.GetRequestStream(); 
newStream.Write(data, 0, data.Length); 
newStream.Close(); 

System.IO.StreamReader st = new StreamReader(((HttpWebResponse)myRequest.GetResponse()).GetResponseStream()); 

使用這個代碼,我得到這個錯誤:

The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.

問題是什麼?

+1

看看這個帖子,MAYB它可以幫助u到 http://stackoverflow.com/questions/703272/could-not-establish-trust-relationship-for-ssl-tls-secure-通道肥皂 – JohnnBlade

+0

謝謝Johnn Blade –

+0

[C#忽略證書錯誤?](http://stackoverflow.com/questions/2675133/c-sharp-ignore-certificate-errors) –

回答

45

我解決了這個問題:

ServicePointManager.ServerCertificateValidationCallback = new   
RemoteCertificateValidationCallback 
(
    delegate { return true; } 
); 
+13

這個解決方案可能會成爲潛在的安全威脅正在關閉SSL證書驗證。如果這是生產代碼,請理解您要連接的服務器的風險。 – Amzath

+0

這怎麼能在Windows Phone 8中完成? ServicePointManager不在參考中http://cmsresources.windowsphone.com/devcenter/en-us/downloads/064028-microsoft-poster.pdf –

+1

當通過Fiddler從我的應用程序中收集請求時,我遇到了問題。並且添加委託技巧以不驗證證書幫助我成功運行我的調用,以及在Fiddler中查看響應。 –

-3

這是客戶端代碼,對吧?而且您正在訪問HTTPS網址,對嗎? 我認爲問題出在客戶端TLS堆棧無法驗證的服務器證書上。 當您通過瀏覽器連接到該URL時,它是否正常工作或您是否看到證書不匹配的警告?

+0

是的,這是一個客戶端代碼。是的,即時通過https訪問。當我在瀏覽器中連接時,它工作順利,沒有看到任何警告。 –

+0

如果您對網絡分析儀(例如NetMon的Wireshark)感到滿意,您可以簡單地嗅探流量並查看您真正與哪個主機通話,目前以及TLS握手是否完成,有無錯誤。否則,您獲得參考的鏈接是一個好的開始。 如果這不能幫到你,你可以開始在這裏泄露你的設置的更多細節(你正在訪問的URL,安裝在服務器上的證書,網絡配置 - 代理等) – Kastorskij

0

確保您的證書是正確可信的。是否已將根證書添加到正確的證書存儲區(本地計算機上受信任的根CA)?

當(自己創建的)證書(自簽名)證書已被添加到當前用戶的受信任根CA時,我遇到此錯誤。將根證書移到本地計算機上的根CA存儲解決了我的問題。

相關問題