WCF分布式開發常見錯誤(23):This could be due to the fact that the server certificate is not configured properly with HTTP.SYS
當使用Transport安全模式,WSHTTPBingding, 客戶端認證類型為 Windows:clientCredentialType="Windows" .
安裝了證書,也添加了客戶端服務引用。啟動服務宿主,客戶端也添加了賬 號。結果就出錯了。
信息如下:
An error occurred while making the HTTP request to https://localhost:9001/WCFService. This could be due to the fact that the server certificate is not configured properly with HTTP.SYS in the HTTPS case. This could also be caused by a mismatch of the security binding between the client and the server.
可能是由於服務器證書在HTTPS 箱子裡與HTTP.SYS 設置不匹配。也可以由於 客戶端和服務端之間的綁定不一致導致。
問題發到WCF中英文論壇,一個WCF英文論壇版主Richard,給了提示。他自己 的一個連接。我看了一下。有點收獲。
WCF中文論壇問題地址:http://social.microsoft.com/Forums/zh- CN/wcfzhchs/thread/5ca6ee28-76cb-4395-82ea-21160cd4ebb0
WCF英文論壇問題地址:http://social.microsoft.com/Forums/en- US/wcf/thread/c39ce206-a86b-4faf-a427-8d4e4684758c
【1】錯誤信息截圖:
【2】問題原因:
導致此問題的原因可能是:
(1)證書沒有設置,transport安全模式,需要建立SSL安全套接層或者TLS 傳輸層安全協議。服務器要提供證書。
(2)WCF終結點地址沒有設置證書,這裡要建立SSL需要對中節點地址設置證 書。
【3】解決辦法:
(1)制作證書:這裡直接使用makecert 工具。Microsoft Visual Studio 2008-->Visual Studio Tools-->Visual Studio 2008 命令提示行裡輸入 :
makecert -r -pe -n "CN=FrankWCFServer" -ss My -sky exchange
具體大家可以看文章WSE3.0構建Web服務安全(2):非對稱加密、公鑰、密鑰、 證書、簽名的區別和聯系以及X.509 證書的獲得和管理,詳細的介紹。具體的參 數說明:詳細幫助文檔:
(2)設置服務證書:
<behavior name="WCFService.WCFServiceBehavior">
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceCredentials>
<serviceCertificate x509FindType="FindBySubjectName" findValue="WCFHTTPS" storeLocation="CurrentUser"/>
</serviceCredentials>
</behavior>
(3)為服務終結點地址注冊SSL證書:
現在證書還不可用,需要為使用的端口注冊證書。這裡需要設置工具, Windows Server 2003 或 Windows XP,則使用 HttpCfg.exe 工具。Windows Server 2003 中已安裝該工具。下載該工 具/Files/frank_xl/HttpcfgFrankXuLei.rar。
如果運行的是 Windows Vista,則使用已安裝的 Netsh.exe 工具。在 Windows\System32目錄下。
【4】SSL證書設置過程:
要查出證書指紋的值,在浏覽器--內容--證書裡,選擇你創建的證書-詳細信 息--微縮圖(thumbprint其實是指紋的意思)把這個值拷貝出來,中間的空格可 以再文本編輯器裡替換掉。這裡WCFHTTPS的是 0307d727a369378d077809cf0ed617eec90a0e2f。
【4.1】查詢SSL證書設置:
(1)在 Windows Server 2003 或 Windows XP 中,通過 query 和 ssl 開 關使用 HttpCfg.exe 工具查看當前端口配置,在命令窗口切換到HttpCfg在文件 目錄,你如下面代碼:
httpcfg query ssl
(2)Vista:
netsh http show sslcert
【4.2】設置SSL證書:
(1)在 Windows Server 2003 或 Windows XP:
httpcfg set ssl -i 0.0.0.0:9001-h 0307d727a369378d077809cf0ed617eec90a0e2f
(2)Vista:
netsh http add sslcert ipport=0.0.0.0:9001 certhash=0307d727a369378d077809cf0ed617eec90a0e2f appid={111111111- 2222-3333-4444-qqqqqqqqqqqqq} 。最後一個GUID.你可以隨便編寫一個。使用 工具也可以。certhash 參數指定證書的指紋。ipport 參數指定 IP 地址和端口 ,功能類似於前述 Httpcfg.exe 工具的 -i 開關。appid 參數為可用於標識所 屬應用程序的 GUID。
【4.3】刪除SSL證書:
(1)Windows Server 2003 和 Windows XP 中:
httpcfg delete ssl -i 0.0.0.0:9001-h 0307d727a369378d077809cf0ed617eec90a0e2f
(2)Vista:
Netsh http delete sslcert ipport=0.0.0.0:9001
【5】總結:
配置完成以後,就可以啟動托管宿主了。SSL證書配置相對復雜。在實現傳輸 安全的是時候需要設置證書到特定的端口。很多代碼都沒給出提示。這個需要注 意。大部分文章之給出理論,實際對問題解決參考不大,代碼實際開發需要自己 實踐。我在解決這個問題的時候,嘗試了很多方式。結果結果就是不對,快包崩 潰的時候,試驗成功了。這個就是最開心的。
運行宿主結果如下: