天天看點

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

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

1、 證書加密應用背景

在網絡化的環境中,特别是基于網際網路釋出的WCF分布式應用程式,資料的加密傳輸就顯得非常重要,通過對網絡資料的加密可以有效保障系統的安全可靠性、私密性。

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

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

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

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

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

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

裡面的内容,包括輸入及擷取到的輸出内容,均被加密的亂七八糟,一塌糊塗,即使是在公網中,看到也是白搭,不知是美女還是野獸。實作以上的加密操作,在調用上,完全不會受影響,還是和原來的調用一樣,不過需要在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開發架構之證書加密使用說明書

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

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

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

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

 架構大量使用了基于泛型的資料傳輸接口,是以建立服務調用的用戶端,需要在【進階】視窗設定中,添加泛型的轉換接口設定(在集合類型中選擇System.Collections.Generic.List,其他預設),如下圖所示。

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

 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=》在控制台中選擇檔案=》添加/删除管理單元=》添加=》選擇證書=》彈出證書管理單元選擇計算機賬戶,預設下一步确定回來,就看到下面的界面。

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

在上面我們可以看到建立在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 部分内容如下所示。

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

3.4 授權IIS通路伺服器證書

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

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

要解決上面的錯誤, 隻需要給相應的賬号配置設定權限即可,這裡IIS通路證書密鑰的權限可以通過WinHttpCertCfg.exe來處理,隻需要通過指令行執行該程式即可,如下所示。

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

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

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

這裡另外也介紹下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 在伺服器證書管理中導入伺服器端證書

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

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

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

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

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

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

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