2011-07-01 52 views
11

當使用HTTPS調用服務器上運行的Web服務時,我的應用程序拋出System.Net.WebException,並顯示消息「底層連接已關閉:可以不與遠程服務器建立信任關係「。我不知道如何解決此問題併成功撥打電話。通過HTTPS消費Web服務時引發System.Net.WebException

+0

你能通過瀏覽器訪問URL嗎?如果是這樣,瀏覽器是否提醒您證書無效? – dlev

回答

17

經過一番研究,我發現了一個博客條目由Jan Tielens這也解釋了是怎麼回事,和我的問題解決方法:

當您瀏覽到一個HTTPS網站,你可能會得到一個對話窗口,詢問你如果你想信任Web服務器提供的證書。所以接受證書的責任由用戶處理。讓我們回到web服務場景,如果您想要調用位於使用SSL和HTTPS的Web服務器上的Web服務,則存在問題。當你通過代碼進行調用時,沒有彈出對話窗口,並詢問你是否信任該證書(幸運的是,這在服務器端場景中會非常醜陋)。也許你會得到以下異常:

System.Net.WebException類型的未處理的異常出現在System.dll中
附加信息:基本 連接已經關閉:無法 建立與 遠程服務器的信任關係。

但對於這個 問題的解決方案,你可以通過創建自己的 CertificatePolicy類( 實現ICertificatePolicy 接口)在 代碼解決這個問題。在這個類,你會 必須寫自己的 CheckValidationResult功能 必須返回truefalse,就像你 會按yes或no在對話框 窗口。爲發展宗旨,我 創建了以下類 接受所有的證書,所以你不會 得到討厭WebException了:

public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy 
{ 
    public TrustAllCertificatePolicy() { } 

    public bool CheckValidationResult(ServicePoint sp, X509Certificate cert, WebRequest req, int problem) 
    { 
     return true; 
    } 
} 

因爲你總是可以看到 CheckValidationResult功能 返回true,所以所有的證書都會被信任 。如果您想讓此類更安全一些,則您可以使用參數 X509Certificate參數添加其他檢查。 要使用此CertificatePolicy,你 必須告訴ServicePointManager 使用它:

System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy(); 

這必須使 調用之前完成(在 應用程序生命週期一次)到您的web服務。

3

如果您使用自簽名SSL證書或不可信SSL證書,您可以告訴應用程序忽略它(如果您真的想忽略它)。例如

ServicePointManager.ServerCertificateValidationCallback = _ 
     new RemoteCertificateValidationCallback(IgnoreSelfSSL) 

public bool IgnoreSelfSSL(ServicePoint sp, X509Certificate cert,WebRequest req, int problem) { 
    return true; 
} 

您可以任何地方回調將執行之前您的服務請求被擊中。

1

回答中給出的提示應該使用僅用於測試。對於驗收/生產,您應該在機器上安裝WS證書以撥打WS,並在調用WS-expiration,主題等之前進行證書驗證。然後您可以通過SoapHttpClientProtocol.Proxy.ClientCertificates將此證書添加到WS請求。