WCF X.509證書驗證提高安全級別
在WCF中,有一種驗證機(jī)制是通過證書來進(jìn)行的。這種安全機(jī)制可以為我們打造一個安全性非常高的解決方案。在這篇文章中,我們將會為大家詳細(xì)介紹一下WCF X.509證書驗證的相關(guān)應(yīng)用方法。#t#
最近在配WCF X.509證書驗證,我想在服務(wù)端實現(xiàn)SSL加密,然后當(dāng)客戶端調(diào)用服務(wù)時,需要出示自己的數(shù)字證書以證明自己是合法的用戶。配置過程很麻煩,不像書上說的那樣。我總結(jié)了一下有如下幾點需要注意。
在IIS部分,對于有服務(wù)器證書的WCF服務(wù)站點,可以要求SSL連接,128位加密,但是不能要求客戶端證書。在WCF服務(wù)部分,不能使用wsDualHttpBinding,應(yīng)為它一個通道SSL,另一個通道不能保證安全,在服務(wù)運(yùn)行時會抱錯。
配置過程大致有以下幾步:
1。配置IIS SSL服務(wù)器證書
2。獲取并設(shè)置客戶端證書
3。配置WCF的服務(wù)端和客戶端
上述第1步,涉及到IIS的應(yīng)用,不是本文重點,相信玩過IIS和證書頒發(fā)機(jī)構(gòu)的朋友都不陌生,不做敘述了。第2步的中獲取證書也是比較容易的,配置證書就比較麻煩,新證書一般默認(rèn)安裝到本機(jī)的Current_User\My下,非系統(tǒng)管理員無法獲取其私鑰,而WCF客戶端又需要獲取該證書私鑰以向服務(wù)端證明自己的身份,而且WCF客戶端運(yùn)行時使用的是非本機(jī)管理員帳號,這就導(dǎo)致了WCF會報出無法找到證書的錯誤。解決這個問題,我們需要使用名為“Windows HTTP 服務(wù)證書配置工具”(WinHttpCertCfg.exe) 的工具為證書指定權(quán)限。該工具包含在Windows Server 2003 Resource Kit Tools可以到微軟下載,地址是:http://www.microsoft.com/downloads/details.aspx?FamilyID=9d467a69-57ff-4ae7-96eeb18c4790cffd&displaylang=en 下載好后在命令行類似下面的命令
WinHttpCertCfg.exe -g -c CURRENT_USER\MY -s "Issued_To_name" -a DOMAIN\account
就是說給account帳號賦予獲取私鑰的權(quán)限,可用ASPNET,NETWORKSERVICE等,-s后面是要搜索的條件。在分配完權(quán)限后,最好關(guān)掉IIS的進(jìn)程,這樣設(shè)置生效比較快 ,同樣我們也需要配置服務(wù)所需的WCF X.509證書驗證。
做完了第2步,第3步就好辦了,貼一下我的配置服務(wù)端
- < behaviors>
- < serviceBehaviors>
- < behavior name="MemberServiceBehavior">
- < serviceMetadata httpGetEnabled="false" httpsGetEnabled="true">
- < serviceDebug includeExceptionDetailInFaults="false"/>
- < serviceCredentials>
- < serviceCertificate storeName="My" storeLocation="LocalMachine"
x509FindType="FindBySubjectName"- findValue="membershipapi"/>
- < /serviceCredentials>
- < /behavior>
- < /serviceBehaviors>
- < /behaviors>
- < bindings>
- < wsHttpBinding>
- < binding name="wsHttpCredentialBinding">
- < security mode="TransportWithMessageCredential">
- < transport clientCredentialType="Certificate"/>
- < message clientCredentialType="Certificate" />
- < /security>
- < /binding>
- < /wsHttpBinding>
- < /bindings>
客戶端
- < behaviors>
- < endpointBehaviors>
- < behavior name="clientCredentialBehavior">
- < clientCredentials>
- < clientCertificate storeName="My" storeLocation="CurrentUser"
findValue="MemberApiClient" x509FindType="FindBySubjectName" />- < serviceCertificate>
- < authentication certificateValidationMode="ChainTrust"/>
- < /serviceCertificate>
- < /clientCredentials>
- < /behavior>
- < /endpointBehaviors>
- < /behaviors>
我這樣的配置雖然客戶端在不提供WCF X.509證書驗證的情況下仍然能夠看到服務(wù)的元數(shù)據(jù)終結(jié)點(主要是因為IIS沒有配置為要求客戶端證書),但是在調(diào)用服務(wù)時如果沒有證書,就會抱錯,目的基本達(dá)到。
最后我想說一下,書上講authentication certificateValidationMode配置為PreeTrust比較好,只要在信任的人的列表里就可以通過驗證,可是經(jīng)過我的試驗似乎不是這樣,在我的客戶端和服務(wù)中,authentication certificateValidationMode值配置為PreeTrust或ChainTrust沒有什么區(qū)別,客戶端都需要將證明自己的WCF X.509證書驗證找出來,提供給服務(wù),不然就要抱錯。


2011-08-19 12:17:46




