天天看點

WCF開發架構形成之旅--如何實作X509證書加密

在前面幾篇文章,均介紹了一些WCF服務的開發經驗,對于資料的加密傳輸,重要性不言而喻。關于在WCF使用證書加密的重要性,在上篇随筆《

是以自從開始使用WCF以來,一直想使用合适的資料加密傳輸來解決問題,WCF常用的就是使用X509證書來實作加密,開始建立WCF服務,并順利調用,以為一且均很美好,但是這個X509加密處理方式卻令人頭痛不已,一直沒能順利調通,并參考了很多www.codeproject.com上的相關文章,裡面有很多不錯的文章,不過很多不夠系統,也說得不夠具體化。本文的意圖就是詳細、系統化介紹如何處理證書加密的操作,友善自己及他人日常開發WCF借鑒。

首先先介紹一下前人對WCF開發中應用證書加密的一些思路介紹,個人覺得比較靠譜的是這兩篇文章

綜上所述,要成功部署基于X509證書加密的操作,需要這幾方面的知識和操作步驟。

1、 建立WCF服務應用以及調用用戶端。

2、 建立客戶證書和服務端的X509證書

3、 配置服務端的配置檔案,使之使用X509證書服務。

4、 授權IIS通路伺服器證書

5、 在伺服器證書管理中導入伺服器端證書

6、 在用戶端導入用戶端證書,完成X509證書配置并調用服務。

下面就這幾方面分别介紹相關的處理。

1、建立WCF服務應用以及調用用戶端。  

在VS2008 的DOS指令提示中,輸入下面的指令即可建立相關的伺服器和用戶端證書

makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=ParkingServer -sky exchange -pe

makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=ParkingClient -sky exchange -pe 

下面是各種參數的介紹

屬性

解析

-sr

指定的證書存儲區中的系統資料庫位置。 

currentUser 

指定注冊版存儲位置為 HKEY_CURRENT_USER. 

localMachine 

指定注冊版存儲位置為 HKEY_LOCAL_MACHINE.

-ss

指定證書存儲的位置。

-a

指定相關的算法,可以選擇 MD5 算法或者 SHA1算法

-n

指定證書的名稱。該名稱遵循X.500命名标準。簡單例子如 "CN=MyName" 格式,如果沒有指定/n開關,證書預設的名稱是"Joe's Software Emporium"。

-sky

證書鍵類型。可以設定為 exchange 或者 signature。

-pe

證書可導出

建立證書成功後,我們在開發的機器上就可以看到兩個不同的證書了。

要看這兩個證書,需要執行下面操作, 開始-》運作-》mmc.exe=》在控制台中選擇檔案=》添加/删除管理單元=》添加=》選擇證書=》彈出證書管理單元選擇計算機賬戶,預設下一步确定回來,就看到下面的界面。

在上面我們可以看到建立在LocalMachine賬戶下的證書,我們輕按兩下檢視證書可以看到這個證書是一個不受信任的證書,但是我們還是可以使用的,隻是需要在Web.Config配置資訊中,certificateValidationMode 屬性指定為None,而不能指定其他信任值。

根據建立的證書資訊,我們修改Web.Config檔案,使之應用X509證書加密,如下所示。關鍵的地方是設定驗證方式使用證書。

 <security mode="Message"> 

     <message clientCredentialType="Certificate"/>

</security>

而證書的相關資訊指定如下。

<serviceCertificate findValue="ParkingServer"

       x509FindType="FindBySubjectName"

       storeLocation="LocalMachine"

       storeName="My"/> 

上面标示證書名稱是ParkingServer ,通過查找名字方式對應,并且存儲在本地計算機賬戶、個人證書目錄下的位置。

Web.Config 部分内容:

完成以上操作後,如果你的開發機器是XP,那麼應該服務端是可以運作正常了,如果你的開發機器是Window2003,那麼,恭喜你中獎了,運作服務後會出現下面的錯誤資訊的:[ArgumentException: 證書“CN=ParkingServer”必須具有能夠進行密鑰交換的私鑰。該程序必須具有通路私鑰的權限。],如下圖所示。

winhttpcertcfg -g -c LOCAL_MACHINE\My -s ParkingServer -a "NETWORKSERVICE" 

運作指令後,在運作WCF服務,一切OK了

列出證書的授權清單

winhttpcertcfg -l -c LOCAL_MACHINE\My -s ParkingServer -a "NETWORKSERVICE"

給IIS的NETWORKSERVICE賬戶以基于證書名稱模式授權

winhttpcertcfg -g -c LOCAL_MACHINE\My -s ParkingServer -a "NETWORKSERVICE"

給IIS的NETWORKSERVICE賬戶以基于證書檔案模式授權

winhttpcertcfg -g -i "ParkingServer.pfx" -c LOCAL_MACHINE\My -a "NETWORKSERVICE" -p

移除賬号對于證書的授權

winhttpcertcfg -r -c LOCAL_MACHINE\My -s ParkingServer -a "NETWORKSERVICE" 

 完成以上步驟,如果服務配置檔案正确,基本上在開發機器上不會有什麼問題了,但是如果把服務部署到另外一台伺服器機器上,那麼就會可能出現找不到證書的錯誤。因為服務還沒有導入建立好的證書呢。

首先我們在開發機器上,在證書的控制台中標明服務端證書并導出即可把服務端證書導出到檔案中,如下圖所示。

記得在導出的時候選擇帶私鑰的選項即可,導出的檔案儲存為ParkingServer.pfx。然後我們在伺服器中,在相同的控制台中把服務端的證書導入即可使得WCF服務在伺服器中也可以正常通路了。

如果用戶端需要部署很多個,那麼每個用戶端需要把第二步建立的用戶端證書導入,才能正常友善伺服器的WCF服務,否則會出現證書的各種提示錯誤。

如果這些操作完成,那麼真誠恭喜你,真的可以使用WCF服務了,而且是使用了X509證書加密的WCF服務。 

繼續閱讀