2009-10-27 53 views
17

我正在創建一個WCF應用程序,我將使用證書來加密客戶端和服務器之間的通信。在我的開發環境中,我想使用我使用makecert創建的測試證書/自簽名證書。 (只有服務器會有證書,客戶端不會)。爲什麼WCF抱怨身份檢查失敗?

我已經將證書安裝到證書存儲中,並且一切正常。在客戶端,由於我正在使用測試證書,因此certificateValidationMode當前設置爲「false」。

我的問題:

在客戶端上的app.config,我需要指定的標識元素,因爲這:

<endpoint ... > 
    <identity> 
     <dns value="<Name-Of-Server-Computer>"/> 
    </identity> 
</endpoint> 

如果我刪除標識元素,我收到以下錯誤消息在客戶端嘗試連接到服務器時:

傳出消息的身份檢查失敗。遠程端點的預期DNS標識是'localhost',但遠程端點提供了DNS索賠'服務器名稱'。如果這是一個合法的遠程端點,則可以通過在創建通道代理時明確指定DNS標識「Name-Of-Server-Computer」作爲EndpointAddress的標識屬性來解決問題。

因此,這裏是我的問題:

  • 是身份檢查只使用測試/自簽名證書時做了什麼?當我使用從CA購買的真實可信的證書部署應用程序時,身份檢查仍會進行嗎?

  • 有沒有辦法禁用身份檢查?我知道我可以創建自己的自定義證書驗證程序,但似乎沒有辦法使用這些驗證程序來覆蓋身份驗證。

回答

10

該檢查始終 - 而且應該是。基本上,WCF將檢查證書頒發給您的服務所在的域名(yourcompany.com)或機器名稱。這是一個安全檢查,我永遠不會禁用!否則,欺騙您的服務的任何人都可以使用製作成任意域名/機器名稱的任何證書並獲得您的流量 - 而不是您想要的!

因此,您需要確保生產服務器上的真實證書確實發佈到生產服務器將成爲其一部分的域名。如果您的生產服務器將在「production.yourcompany.com」中,則需要將該證書發佈到該域。

Marc

+0

>「這是一個安全檢查,我從來沒有禁用!」 只是爲了確保我明白。這是否意味着實際上有辦法禁用它?我確實瞭解檢查的好處...... – Nitramk 2009-10-27 12:00:50

+1

我從來沒有想過要這樣做,所以我從來沒有想過要檢查是否有辦法關閉它。我不知道,對不起。 – 2009-10-27 15:10:04

24

此問題的答案在錯誤信息本身。在客戶端上,您可以執行:

EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity("Server"); 
EndpointAddress address = new EndpointAddress(new Uri("net.tcp://1.2.3.4:12345/ServiceName"), identity); 

替換「服務器」,無論預期如何。通常這將是您的自簽名證書的通用名稱(CN)。 這樣做不會破壞安全性,只要您承擔所有責任確保提供的證書有效,即創建您的自定義證書驗證程序並在那裏進行相關檢查。

+0

你是對的!這個答案是正確的。 – 2016-12-01 20:47:42

3

certificateValidationMode應設置爲「無」,而不是「假」 ......

相關問題