2011-12-21 66 views
3

我在C#中編寫了一個.NET應用程序,它接觸了幾個Web服務。當我在非安全的URL上引用Web服務時,一切正常;但是當我在安全的HTTPS URL上引用相同的Web服務時,出現異常,並顯示消息「無法建立SSL/TLS安全通道的信任關係」。使用SetCertificatePolicy建立安全Web服務的信任關係()

我在這個網頁http://www.codemeit.com/wcf/wcf-could-not-establish-trust-relationship-for-the-ssltls-secure-channel-with-authority.html被指出。並將代碼添加到我的應用程序中。這可以解決問題,我現在可以按預期使用安全Web服務。

我注意到上面的代碼段說「不打算在生產環境中使用」,它當前信任任何證書。爲了讓生產環境更安全,我是否應該檢查自己的證書?我應該如何檢查這一點,方法RemoteCertificateValidate()中的'cert'參數中有很多信息,所以我不知道應該如何或者應該檢查什麼。

TIA

回答

0

這是極有可能的原因是與使用的服務器身份本身,當您的客戶端建立安全的SSL連接的證書有問題。根據我的經驗,這主要是由服務器返回的證書不是由受信任的根管理機構簽署的,或者鏈中的一個或多個證書無效(例如,它們已經過期或者針對的域不是您所使用的域連接到)。

爲了幫助識別問題,您可以嘗試瀏覽服務端點URL並查看瀏覽器是否報告任何問題。現代瀏覽器會警告你,如果服務器證書無效,有時會告訴你爲什麼。如果您使用的是Chrome瀏覽器,並且證書存在問題,則會在地址欄左端的掛鎖圖標(或多功能框)中看到一個紅色十字。如果你點擊掛鎖,Chrome會告訴你爲什麼它不喜歡證書。

至於你找到的代碼片段,這是一個如何在.Net中實現服務器證書驗證作爲客戶端的例子。但是,即使服務器證書存在問題,示例本身也不會拒絕與服務器的連接,因此有關在生產中不使用代碼的評論。在測試場景之外,您永遠不想與身份不明的服務器進行通信,因爲證書不正確,您無法信任該服務器。要提供「生產」實現,您必須檢查「錯誤」參數的值,以查看證書是否存在問題,並且只有在沒有問題時才返回true。

using System; 
using System.Net; 
using System.Net.Security; 
using System.Security.Cryptography.X509Certificates; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Attach my certificate validation delegate. 
      ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate; 

      System.Net.HttpWebRequest request = WebRequest.CreateHttp("https://www.google.com"); 
      HttpWebResponse response = request.GetResponse() as HttpWebResponse; 
     } 

     private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error) 
     { 
      if (error == SslPolicyErrors.None) 
      { 
       return true; 
      } 

      return false; 
     } 
    } 
} 

在這個例子中,我只是從我的ServerCertificateValidationCallback代表返回true,如果誤差值等於SslPolicyErrors.None,否則我返回false產生異常。爲了使這個例子工作,我使用Fiddler代理請求並將不可信證書返回給我的客戶端代碼。如果您在正常情況下導航到https://www.google.com,您應該而不是看到任何證書錯誤,因爲谷歌播放不錯!

帶證書的PKI可能是一個粗糙的工作區域。文檔Wikipedia has a good article on PKI涵蓋了如何使用可信機構對SSL中使用的證書進行簽名,以便客戶端可以信任他們正在與之通信的服務器的身份。

相關問題