WCF開發框架之證書加密使用說明書


WCF開發框架的證書加密操作,前面在框架之旅做了一篇介紹,本文主要是將各種相關知識點綜合起來進行介紹,以期達到系統化介紹在我的WCF開發框架(也可以應用於您的WCF框架)中使用證書加密的常規操作和步驟。在WCF應用日益廣泛的環境下,注意數據的安全性以及系統穩定性的問題,是我們設計初期必須考慮的重要舉措之一,特別對一些行業比較敏感的數據或者重要機關的數據,這個是一個硬性規定的前提條件之一。在WCF開發框架中,應用X.509證書加密可以解決這個問題,但是要使用這個東西,我們必須對相關的知識點有所了解,然后對相關的配置進行設置,才能正常進行使用。

1、 證書加密應用背景

在網絡化的環境中,特別是基於互聯網發布的WCF分布式應用程序,數據的加密傳輸就顯得非常重要,通過對網絡數據的加密可以有效保障系統的安全可靠性、私密性。

默認情況下,WCF調用是不經過數據加密的。通過默認操作實現的服務以及客戶端調用,數據傳輸情況是如何的。我這里通過HTTP網絡包分析工具Http Analyzer來對數據進行監控看看,如下所示。

 

可以看到,輸入及輸出的結果全部是明文,數據傳輸沒任何秘密可言。當然,你也可以對這些數據自己加密后發送出去,但是每個接口,大量信息也要這樣自己手工加密嗎,難道微軟的WCF那么弱智?

當然不是,這些操作交給WCF處理會便捷很多,傳說中有一個X509的證書加密,不過如果是第一次搞這個,要完全調通要走不少彎路,我就是參考了很多文章(很多文章都介紹了一部分內容,很少能系統性的給你提出完全的解決方法),遇鬼殺鬼,遇佛拜佛,逐步排除各種險阻,這樣慢慢才有一個清晰的思路,逐步解決問題,最終才有心思來寫這篇文章,后面的隨筆我會介紹完整的解決思路來處理X509加密的操作。

WCF常用的就是使用X509證書來實現加密,通過X509加密處理后,我們看到下面的效果。

 

里面的內容,包括輸入及獲取到的輸出內容,均被加密的亂七八糟,一塌糊塗,即使是在公網中,看到也是白搭,不知是美女還是野獸。實現以上的加密操作,在調用上,完全不會受影響,還是和原來的調用一樣,不過需要在WCF的服務以及調用的客戶端進行一些文件配置等操作即可。

綜上所述,本文介紹的WCF框架的證書加密操作,具有下面幾個特點:

  1)不需增加額外的代碼,通過外置配置即可實現對應的加解密操作。

  2)數據傳輸字段及內容均已進行加密,加密是通過證書對(服務器客戶端各一個)進行處理。

  3)高配置型、靈活性的實現方式。

2、WCF框架中使用證書加密注意事項

1) 我們一般通過Windows內置工具或者命令行創建的證書,其實是臨時用的測試證書,如果在配置文件的Certificate ValidationMode屬性中使用除了“None”屬性外的值,就不能順利運行調用服務。這個問題其實可以通過在Windows2003中部署證書服務來創建合格的證書,不過需要先搭建好證書服務平台(或者花錢購買)。

2) 開發機器上部署服務,如果操作系統是XP系統的話,不用考慮給IIS授權的問題。如果是在Windows2003等服務器機器上,要給IIS授權才能訪問證書,需要使用WinHttpCertCfg.exe或者CertMgr.exe來實現證書的授權等操作。

3、證書加密的開發步驟

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

1)   創建WCF服務應用以及調用客戶端。

2)   創建客戶證書和服務端的X509證書

3)   配置服務端的配置文件,使之使用X509證書服務。

4)   授權IIS訪問服務器證書

5)   在服務器證書管理中導入服務器端證書

在客戶端導入客戶端證書,完成X509證書配置並調用服務。

3.1 創建WCF服務應用以及調用客戶端 

這個是基本的操作,客戶可以創建適合自己的WCF開發框架,這里介紹的WCF開發框架,時基於我的Winform開發框架擴展而成的WCF框架,是一種比較完善、高效、彈性化的開發框架,詳細步驟及說明請參考隨筆《基於我的Winform開發框架擴展而成的WCF開發框架》,使用這種方式構造的開發框架,各層職責比較分明,而且方便管理。

架構視圖如下所示:

 

項目工程截圖如下所示(參考視圖):

 

調用客戶端需要添加WCF服務的引用,操作如下所,注意一般約定的命名規則為ABCServiceReference

  

 框架大量使用了基於泛型的數據傳輸接口,因此創建服務調用的客戶端,需要在【高級】窗口設置中,添加泛型的轉換接口設置(在集合類型中選擇System.Collections.Generic.List,其他默認),如下圖所示。

 3.2 創建客戶證書和服務端的X509證書

 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,而不能指定其他信任值。

3.3 配置服務端的配置文件,使之使用X509證書服務

根據創建的證書信息,我們修改Web.Config文件,使之應用X509證書加密,如下所示。關鍵的地方是設置驗證方式使用證書。

 <security mode="Message"> 
     <message clientCredentialType="Certificate"/>
</security>

而證書的相關信息指定如下。

<serviceCertificate findValue="ParkingServer"
       x509FindType="FindBySubjectName"
       storeLocation="LocalMachine"
       storeName="My"/> 

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

Web.Config 部分內容如下所示。

 

3.4 授權IIS訪問服務器證書

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

 

要解決上面的錯誤, 只需要給相應的賬號分配權限即可,這里IIS訪問證書密鑰的權限可以通過WinHttpCertCfg.exe來處理,只需要通過命令行執行該程序即可,如下所示。

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

運行命令后,在運行WCF服務,一切OK了

 

這里另外也介紹下WinHttpCertCfg.exe來進行處理的幾個命令。

列出證書的授權列表
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" 

3.5 在服務器證書管理中導入服務器端證書

完成以上步驟,如果服務配置文件正確,基本上在開發機器上不會有什么問題了,但是如果把服務部署到另外一台服務器機器上,那么就會可能出現找不到證書的錯誤。因為服務還沒有導入創建好的證書呢。首先我們在開發機器上,在證書的控制台中選定服務端證書並導出即可把服務端證書導出到文件中,如下圖所示。

 

記得在導出的時候選擇帶私鑰的選項即可,導出的文件保存為ParkingServer.pfx。然后我們在服務器中,在相同的控制台中把服務端的證書導入即可使得WCF服務在服務器中也可以正常訪問了。

3.6 在客戶端導入客戶端證書,完成X509證書配置並調用服務

如果客戶端需要部署很多個,那么每個客戶端需要把第二步創建的客戶端證書導入,才能正常方便服務器的WCF服務,否則會出現證書的各種提示錯誤,導入操作如下所示。

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

 另外,為了使用X.509證書服務,客戶端的配置文件確保如下所示,注意證書部分的設置即可。

 

關於我的Winform開發框架和WCF開發框架的特點,可以訪問網站介紹地址(http://www.iqidi.com/Framework/info.html?flag=3)進行了解.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM