2011-02-12 94 views
8

這可能是一個愚蠢的問題,但我無法找到答案。如何接受WCF客戶端中的自簽名SSL證書?

我想要做的事情: 我有一個由IIS託管的WCF服務。它工作得很好,我可以訪問wsdl,我有一個服務器自簽名證書等。我想從WPF客戶端調用此服務。

問題是,由於我有自簽名證書,因此在調用服務時出現以下異常: 無法爲權限爲'localhost'的SSL/TLS安全通道建立信任關係。

如果我從瀏覽器訪問網站(或服務),這是沒有問題的,因爲瀏覽器會警告我關於證書的信息,並允許我選擇瀏覽網頁。但WPF客戶端只是拋出一個異常。

我不想完全關閉身份驗證過程,我只是想讓用戶可以選擇忽略此警告(如瀏覽器所做的那樣)。

任何人都可以提供一些代碼嗎?如果你遇到了一個很好的,詳細的教程,這將是非常棒的。 (請參閱我發現的教程的問題是缺少詳細信息)

+0

我改變的問題,以反映自簽名證書不屬於受信任的默認問題根證書。 – 2011-02-12 09:37:38

回答

6

您可以自己註冊證書。如果將證書加載到客戶端,然後將其註冊爲可信,則不應該得到該警告。

您需要找到一個X509CertificateCollection並將證書添加到該集合。運行Ssl的SmtpClient出現了這種問題。

掛鉤System.Net.ServicePointManager.ServerCertificateValidationCallback或實施System.Net.ICertificatePolicy並將我自己安裝的證書標識爲有效/可信(附於System.Net.ServicePointManager.CertificatePolicy)。

這不是WCF的東西本身,但從我可以告訴,這應該轉化爲WCF。這一切都取決於WCF在底層使用什麼。

+1

你能指定在哪裏寫這個東西?什麼類應該實現接口等?我對WCF這個方面絕對陌生,我從來沒有使用安全連接或IIS,所以我仍然有點丟失...... – Tenshiko 2011-02-12 10:09:32

+0

如果你掛鉤了`System.Net.ServicePointManager.ServerCertificateValidationCallback`你會得到一個請求驗證證書? – 2011-02-13 22:00:35

12

下面是讓WCF客戶端接受任意證書所需的最小代碼量。這是不安全。僅用於測試。如果這段代碼瘋狂吃掉你的小貓,不要責怪我。

ServicePointManager.ServerCertificateValidationCallback += 
      new System.Net.Security.RemoteCertificateValidationCallback(EasyCertCheck); 

回叫:

bool EasyCertCheck(object sender, X509Certificate cert, 
     X509Chain chain, System.Net.Security.SslPolicyErrors error) 
{ 
    return true; 
} 

代碼無恥地從最小的有用的答案提升到Is it possible to force the WCF test client to accept a self-signed certificate?