原創|其它|編輯:郝浩|2009-08-28 10:13:37.000|閱讀 910 次
概述:今天繼續介紹WCF分布式安全開發實踐(12):消息安全模式之自定義X509證書驗證,Message_CustomX509Certificate_WSHttpBinding 。本文介紹的內容主要是:主要是消息安全模式的自定義證書身份驗證方式,基于WSHttpBinding綁定協議的實現過程。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
今天繼續介紹WCF分布式安全開發實踐(12):消息安全模式之自定義X509證書驗證,Message_CustomX509Certificate_WSHttpBinding 。本文介紹的內容主要是:主要是消息安全模式的自定義證書身份驗證方式,基于WSHttpBinding綁定協議的實現過程。主要內容:基本概念,然后是制作證書、服務端配置、客戶端配置、總結。這里應該和Transport傳輸安全模式之自定義證書身份驗證對應,但是消息安全模式這里不使用https。安全基于TLS,傳輸層安全連接。
和大部分過程相同。差別在于客戶端證書的驗證過程由我們自己提供。而不是有WCF框架自己完整。
【0】消息安全模式之自定義證書客戶端身份驗證:
消息安全模式之自定義證書身份驗證需要服務器需要一個有效的可用于TLS 加密和向客戶端驗證服務身份的 X.509 證書,并且客戶端必須信任此服務器證書。而客戶端同樣要提供一個有效的證書,來證明自己的身份。 這里使用http協議。建議安全上下文以后,使用共享安全上下文對SOAP消息進行加密和簽名。使用證書對客戶端和服務進行身份驗證。也就是客戶端提供有效證書才可以訪問此服務。
1.身份驗證(服務器):提供證書,(使用 HTTP)用于初始會話協商和證明服務身份。
2.身份驗證(客戶端):客戶端證書進行身份驗證,自定義驗證代碼
WCF消息安全模式之自定義證書身份驗證的架構如下:
客戶端建立TLS安全上下文以后,會使用商定的密碼對消息簽名,客戶端使用證書加密數據,服務端使用證書解密數據,保證數據的安全和機密性,消息簽名放置被篡改。
這里客戶端提供的是有效的證書,服務器端使用自定義代碼對客戶端證書進行驗證。而不是有WCF框架自動完成。
下面是制作證書的過程,和傳輸安全模式的過程一樣,這里直接使用相同證書制作工具,新啟用端口8001。
【1】制作證書:
(1)使用makecert 工具:Microsoft Visual Studio 2008-->Visual Studio Tools-->Visual Studio 2008 命令提示行。
輸入:makecert -sr localmachine -ss My -n CN=WCFServerPK -sky exchange -pe -r
輸入:makecert -sr localmachine -ss My -n CN=WCFClientPK -sky exchange -pe -r。
-這里制作了連個證書,主要只使用一個WCFServerPK,可以到出密鑰文件pfx,后續我們要導入到其他存儲區,設置為信任的證書。WCFClientPK -是為以后文章準備的,也是可以設置為信任的證書。
(2) 打開瀏覽器---->Internet 選項----->內容----->證書----->個人,默認是保存到當前用戶CurrentUser,你會看到剛才制作的證書。這個可以查看部分證書,但是功能有限。我們還是使用控制臺證書管理工具。
(3)使用MMC建立證書控制單元查看證書的信息:
開始--運行--MMC--控制臺--添加刪除單元--證書--當前用戶和計算機各添加一個。能查看和管理CurrentUser和LocalMachine的證書。如圖:
(4)導入證書到信任的人和信任的CA機構里。步驟如下:
1.導出證書文件,帶密鑰的pfx文件。使用mmc,保存到桌面位置(方便查找)。這里記住你制作證書的密碼。要使用。
2.導入證書到信任的人。使用任務-導入向導--選擇證書文件,導入即可。
3.導入證書到信任的機構,使用任務-導入向導--選擇證書文件,導入即可。這個證書就被信任了。
【3】服務端配置:
服務器證書配置完成以后,我們來配置服務端相關的文件,這里簡單。也可以使用代碼來完成。
(1)服務類定義:
重復使用以前定義的服務類代碼。 這里服務類就一個方法就是更具用戶的name來打印調用時間,代碼如下:
(2)消息安全模式配置:
使用消息安全模式,采用客戶端證書身份驗證策略,Message安全模式下的證書驗證方式配置信息如下:
這里允許啟用安全協商和建立安全上下文。這個配置要應用到服務的終結點配置上。才會生效。
(1)服務驗證代碼:
證書制作完整以后,就需要來實現自定義用戶名和密碼的驗證程序。這里要重寫X509CertificateValidator類的 Validate(X509Certificate2 certificate)方法。具體代碼如下:
這里客戶端證書的指紋是748e3f8d07f14750460244045e21633cf1f5b211。如果客戶端提供的證書信息不對,就直接拋出異常,驗證失敗,實際應用我們可以到CA證書機構或者證書數據庫查詢數據,來判定客戶端證書的有效性。傳輸安全保證了用戶名密碼的機密性,而驗證代碼可以靈活地訪問我們系統的數據庫或者CA來判定客戶端是否是有效的客戶端。可以很好的保護WCF服務。與自定義用戶名密碼的方式一樣,驗證程序比較靈活。服務器不需要導入客戶端證書。
自定義客戶端代碼我們在配置文件里設置。代碼如下:
(4)服務器證書使用:
服務器端證書主要是在建立TLS連接會話的時候,證明服務端的身份合法性。
在服務行為節點屬性里配置使用證書WCFServerPK,其它設置采用默認方式。這里和 配置一樣。具體代碼如下:
這里指定了服務端證書的查找位置和查找條件,我們證書存儲在LocalMachine 個人區域。使用標題進行查找。如果相同標題,需要制定唯一的查找條件。保證查找證書的唯一性。否則會出異常。
(5)這里我們不需要使用Https傳輸協議,直接使用http協議即可,服務終結點的配置信息如下:
我們的服務元數據終結點使用基地址:。消息安全模式基本使用的都是相同的端口。
【4】客戶端配置:
這個過程和之前的傳輸安全模式下,參考 , 添加服務的過程一樣。直接引用。
(1)引用元數據:
因為服務的元數據交換節點啟用了Http協議,我們在客戶端項目添加元數據地址查找服務信息的時候,界面如下:
繼續就會添加完畢服務引用。過程和普通的添加服務元數據引用一樣,會產生客戶端相關代碼文件。輸入命名空間,現在我們點擊Ok。等待完成即可。
(2)配置文件:
客戶端配置文件使用默認設置,主要是安全模式的設置要如下,與服務端匹配。使用證書驗證方式。
(3)客戶端證書:
這里我們要在配置文件里提供客戶端的證書,也可以采用代碼方式提供客戶端證書。配置文件的方式比較簡單。
直接在endpointBehaviors里設置以后,應用到終結點行為配置上就可以了。代碼如下:
(4)測試代碼:
等待代碼生成結束,我們這里就直接生成客戶端代理類的實例來調用服務進行測試。這里客戶端在調用服務以前,必須信任證書,這里我們使用了一段通用的代碼,來建立TLS使用。這里會信任服務器的證書。代碼如下:
客戶端測試代碼很簡單,我們不需要提供客戶端證書了,因為配置文件里已經設置完畢。接下來就是通過客戶端代理來調用WCF服務。代碼如下:
這里也可以使用代碼來設置證書wcfServiceProxy.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2("WCFClientPK.pfx", "password");WCFClientPK.pfx是導出的客戶端證書的文件,包含密鑰,密碼為保護密碼。
(4)測試結果:
啟動宿主程序,然后啟動客戶端程序,客戶端成功調用服務,宿主打印的消息。如圖:
【5】總結
Windows Communication Foundation (WCF) 服務和客戶端。WCF安全機制都是依賴現有的安全體系和框架來完成的。這里的消息安全模式下的客戶端證書身份驗證,其實沒有太大的變化。就是使用證書來驗證客戶端的有效性,合法性。
(1)服務器需要一個證明服務器身份和有效的可用于TLS傳輸層安全的 X.509 證書,并且客戶端必須信任此服務器證書。
(2)客戶端提交證書的方式與傳輸安全之證書驗證方式一樣,服務器端需要提供證書,但是不需要httpcfg.exe設置。
(3)初始協商需要服務器證書來建立TLS連接,協商完畢以后,建立共享安全上下文,這里使用商定的加密算法對SOAP消息進行加密和簽名。
(4)如果你啟用協商,而不把服務器證書在客戶端設置信任,導入信任的辦法機構,會出現SOAP安全協商失敗的異常。
(5)和消息安全模式的客戶端證書驗證,過程基本一樣。差別只是在于客戶端證書有效性驗證,前者使用的是WCF框架自定來驗證,這里我們使用的是自定義驗證程序,重新實現了CustomX509CertificateValidator : X509CertificateValidator的Validate(X509Certificate2 certificate)方法。這里我們可以方便的定義具體的驗證策略,也可以把證書信息存在特定的數據庫,或者直接代碼從證書存貯區域獲取證書信息進行驗證。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園