今天繼續(xù)WCF分布式安全開發(fā)實(shí)踐(5):傳輸安全模式之Certificate身份驗(yàn)證。本文介紹的內(nèi)容主要是:主要是傳輸安全模式的Certificate身份驗(yàn)證方式,基于WSHttpBinding綁定協(xié)議的實(shí)現(xiàn)過(guò)程。主要內(nèi)容:基本概念,然后是制作證書、SSL證書設(shè)置、服務(wù)端配置、客戶端配置、總結(jié)。 【0】傳輸安全模式之Certificate身份驗(yàn)證: 傳輸安全模式之Certificate證書身份驗(yàn)證需要服務(wù)器需要一個(gè)有效的可用于安全套接字層 (SSL) 的 X.509 證書,并且客戶端必須信任此服務(wù)器證書。 這里使用https協(xié)議??蛻舳颂峁┯行У?span style="FONT-FAMILY: Arial">Certificate證書。 服務(wù)器通過(guò)證書來(lái)檢驗(yàn)客戶端身份的有效性。
1.身份驗(yàn)證(服務(wù)器):提供證書,(使用 HTTPS) 2.身份驗(yàn)證(客戶端):提供證書
WCF安全模式Certificate證書身份驗(yàn)證的架構(gòu)如下:
客戶端首先要提供自己的證書,服務(wù)器對(duì)此進(jìn)行驗(yàn)證,有效后,服務(wù)器會(huì)和客戶端嘗試建立SSL安全套接層,會(huì)使用商定的密碼對(duì)消息簽名,客戶端使用證書加密 數(shù)據(jù),服務(wù)端使用證書解密數(shù)據(jù),保證數(shù)據(jù)的安全和機(jī)密性,消息簽名放置被篡改。這個(gè)鏈接是唯一的。通信結(jié)束以后會(huì)關(guān)閉連接。 是制作和設(shè)置SSL證書的過(guò)程,和傳輸安全模式的過(guò)程一樣,這里直接使用相同證書和端口。延續(xù)以前的風(fēng)格。 【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。 -這里制作了連個(gè)證書,主要只使用一個(gè)WCFServerPK,可以到出密鑰文件pfx,后續(xù)我們要導(dǎo)入到其他存儲(chǔ)區(qū),設(shè)置為信任的證書。WCFClientPK -是為以后文章準(zhǔn)備的,也是可以設(shè)置為信任的證書。 (2) 打 開瀏覽器---->Internet 選項(xiàng)----->內(nèi)容----->證書----->個(gè)人,默認(rèn)是保存到當(dāng)前用戶CurrentUser,你會(huì)看到剛才制作的證書。這個(gè) 可以查看部分證書,但是功能有限。我們還是使用控制臺(tái)證書管理工具。
(3)使用MMC建立證書控制單元查看證書的信息: 開始--運(yùn)行--MMC--控制臺(tái)--添加刪除單元--證書--當(dāng)前用戶和計(jì)算機(jī)各添加一個(gè)。能查看和管理CurrentUser和LocalMachine的證書。如圖:
 (4)導(dǎo)入證書到信任的人和信任的CA機(jī)構(gòu)里。步驟如下: 1.導(dǎo)出證書文件,帶密鑰的pfx文件。使用mmc,保存到桌面位置(方便查找)。這里記住你制作證書的密碼。要使用。 2.導(dǎo)入證書到信任的人。使用任務(wù)-導(dǎo)入向?qū)?-選擇證書文件,導(dǎo)入即可。 3.導(dǎo)入證書到信任的機(jī)構(gòu),使用任務(wù)-導(dǎo)入向?qū)?-選擇證書文件,導(dǎo)入即可。這個(gè)證書就被信任了。 【2】SSL證書設(shè)置: 下面我們來(lái)設(shè)置SSL端口證書,這個(gè)步驟很重要。不然客戶端無(wú)法查找到WCF服務(wù)。 【2.1】查詢SSL證書設(shè)置: 需要為使用的端口SSL注冊(cè)證書。Windows Server 2003 或 Windows XP,則使用 HttpCfg.exe 工具。Windows Server 2003 中已安裝該工具。下載該工具/Files/frank_xl/HttpcfgFrankXuLei.rar。如果運(yùn)行的是 Windows Vista,則使用已安裝的 Netsh.exe 工具。在Windows\System32目錄下。運(yùn)行此工具需要命令窗口切換到相應(yīng)工具解壓縮目錄下,我直接放置到D盤根目錄。方便查找。 (1)在 Windows Server 2003 或 Windows XP 中,通過(guò) query 和 ssl 開關(guān)使用 HttpCfg.exe 工具查看當(dāng)前端口配置,在命令窗口切換到HttpCfg在文件目錄,你如下面代碼: httpcfg query ssl (2)Vista: netsh http show sslcert
查詢SSL端口證書設(shè)置信息,如圖:
 【2.2】設(shè)置SSL證書: (1)在 Windows Server 2003 或 Windows XP: httpcfg set ssl -i 0.0.0.0:9001-h 9174185b2860b6d5ec3de133d5fcc4e1419b09e5 (2)Vista: netsh http add sslcert ipport=0.0.0.0:9001 certhash=9174185b2860b6d5ec3de133d5fcc4e1419b09e5 appid={11111111-2222-3333-4444-qqqqqqqqqqqqq} 。最后一個(gè)GUID.你可以隨便編寫一個(gè)。使用工具也可以。certhash 參數(shù)指定證書的指紋。ipport 參數(shù)指定 IP 地址和端口,功能類似于前述 Httpcfg.exe 工具的 -i 開關(guān)。appid 參數(shù)為可用于標(biāo)識(shí)所屬應(yīng)用程序的 GUID。 【2.3】刪除SSL證書: (1)Windows Server 2003 和 Windows XP 中: httpcfg delete ssl -i 0.0.0.0:9001-h 9174185b2860b6d5ec3de133d5fcc4e1419b09e5 (2)Vista: Netsh http delete sslcert ipport=0.0.0.0:9001。 【3】服務(wù)端配置: SSL端口證書配置完成以后,我們來(lái)配置服務(wù)端相關(guān)的文件,首先要實(shí)現(xiàn)自定義身份驗(yàn)證的代碼。我們就要對(duì)WCF服務(wù)端進(jìn)行配置,直接使用配置文件,這里簡(jiǎn)單。也可以使用代碼來(lái)完成。 (1)服務(wù)類定義: 這里服務(wù)類就一個(gè)方法就是更具用戶的name來(lái)打印調(diào)用時(shí)間,代碼如下:
//1.服務(wù)契約 [ServiceContract(Namespace = "http://www.cnblogs.com/frank_xl/")] public interface IWCFService { //操作契約 [OperationContract] string SayHello(string name);
} //2.服務(wù)類,繼承接口。實(shí)現(xiàn)服務(wù)契約定義的操作 public class WCFService : IWCFService { //實(shí)現(xiàn)接口定義的方法 public string SayHello(string name) { Console.WriteLine("Hello! {0},Calling at {1} ", name,DateTime.Now.ToLongTimeString()); return "Hello! " + name; } }
(2)傳輸安全模式配置: 使用傳輸安全模式,采用客戶端Certificate證書身份驗(yàn)證策略,transport安全模式下的Certificate證書驗(yàn)證方式要在客戶端基本Certificate證書驗(yàn)證類型下實(shí)現(xiàn)。配置信息如下:
<wsHttpBinding> <binding name="BindingConfiguration"> <security mode="Transport"> <transport clientCredentialType="Certificate"/> </security> </binding> </wsHttpBinding>
這個(gè)配置要應(yīng)用到服務(wù)的終結(jié)點(diǎn)配置上。才會(huì)生效。 (4)證書使用: 在服務(wù)行為節(jié)點(diǎn)屬性里配置使用證書WCFServerPK,這個(gè)服務(wù)器證書就是SSL證書。配置信息如下:
serviceBehaviors> <behavior name="WCFService.WCFServiceBehavior"> <serviceMetadata httpsGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> <serviceCredentials> <serviceCertificate storeName="My" x509FindType="FindBySubjectName" findValue="WCFServerPK" storeLocation="LocalMachine"/> </serviceCredentials> </behavior> </serviceBehaviors>
(5)IE查看元數(shù)據(jù): 配置好托管宿主以后,我們就可以啟動(dòng)宿主。然后在瀏覽器里輸入元數(shù)據(jù)終結(jié)點(diǎn)。點(diǎn)擊瀏覽會(huì)看到如下界面:
 使用的是https協(xié)議, 元數(shù)據(jù)交互也提供了SSL保護(hù)。這里可以點(diǎn)擊繼續(xù)瀏覽,才能看到服務(wù)的信息。如下:
 我們可以在這里點(diǎn)擊鏈接,根據(jù)借助svcutil來(lái)產(chǎn)生客戶端文件。我們這里不做嘗試,客戶端我們直接在項(xiàng)目里添加引用,借助Visual Studio來(lái)完成。 【4】客戶端配置: 這個(gè)過(guò)程和之前的傳輸安全模式下,添加服務(wù)的過(guò)程一樣。直接引用。 (1)引用元數(shù)據(jù): 因?yàn)榉?wù)的元數(shù)據(jù)交換節(jié)點(diǎn)啟用了Https協(xié)議,我們?cè)诳蛻舳隧?xiàng)目添加元數(shù)據(jù)地址https://computer:9001/mex查找服務(wù)信息的時(shí)候,會(huì)提示SSL證書信息,界面如下:
這個(gè)證明我們的服務(wù)端證書設(shè)置已經(jīng)起作用,而且是可信的。現(xiàn)在我們點(diǎn)擊Yes。繼續(xù)就會(huì)添加完畢服務(wù)引用。過(guò)程和普通的添加服務(wù)元數(shù)據(jù)引用一樣,會(huì)產(chǎn)生客戶端相關(guān)代碼文件。輸入NameSpace,等待完成即可。 (2)配置文件: 客戶端配置文件使用默認(rèn)設(shè)置,主要是安全模式的設(shè)置要如下,與服務(wù)端匹配。使用證書驗(yàn)證方式。
<security mode="Transport"> <transport clientCredentialType="Certificate" proxyCredentialType="None" realm="" /> <message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true" /> </security>
這里我們可以在配置文件里設(shè)置證書,WCF客戶端會(huì)根據(jù)配置文件終結(jié)點(diǎn)服務(wù)行為的證書配置信息來(lái)查找客戶端證書。 提交給WCF服務(wù)端。配置代碼如下:
<behaviors> <endpointBehaviors> <behavior name="endpointBehavior"> <clientCredentials> <clientCertificate storeName="My" x509FindType="FindBySubjectName" findValue="WCFClientPK" storeLocation="CurrentUser"/> </clientCredentials> </behavior> </endpointBehaviors> </behaviors>
(3)測(cè)試代碼: 等待代碼生成結(jié)束,我們這里就直接生成客戶端代理類的實(shí)例來(lái)調(diào)用服務(wù)進(jìn)行測(cè)試。這里客戶端在調(diào)用服務(wù)以前,必須提供有效的Certificate證書.使用配置文件設(shè)置完畢以后,就可以測(cè)試,也可以使用代碼來(lái)設(shè)置證書wcfServiceProxy.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2("WCFClientPK.pfx", "password");WCFClientPK.pfx是導(dǎo)出的客戶端證書的文件,包含密鑰,密碼為保護(hù)密碼??蛻舳藴y(cè)試代碼如下:
WCFClient.ClientProxy.WCFServiceClient clientProxy = new WCFClient.ClientProxy.WCFServiceClient("WSHttpBinding_IWCFService"); //通過(guò)代理調(diào)用SayHello服務(wù) //wcfServiceProxy.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2("user.pfx", "password"); string sName = "Frank Xu Lei Transport UserNamePassword WSHttpBinding"; string sResult = string.Empty; Util.SetCertificatePolicy();//強(qiáng)制信任證書。重寫驗(yàn)證服務(wù)端證書的方法。 sResult = clientProxy.Hello(sName); Console.WriteLine("Returned Result is {0}", sResult);
(4)測(cè)試結(jié)果: 啟動(dòng)宿主程序,然后啟動(dòng)客戶端程序,稍作等待,Certificate證書無(wú)效的時(shí)候,服務(wù)器驗(yàn)證客戶端證書失敗,客戶端不能調(diào)用服務(wù)。,當(dāng)我們提供了有效的Certificate證書的時(shí)候,客戶端成功調(diào)用服務(wù),宿主打印的消息。如圖:
 【5】總結(jié) Windows Communication Foundation (WCF) 服務(wù)和客戶端。服務(wù)器需要一個(gè)有效的可用于安全套接字層 (SSL) 的 X.509 證書,并且客戶端必須信任此服務(wù)器證書。 (1) 此處自是在借助傳輸安全Certificate證書驗(yàn)證方式,客戶端提供證書。 (2)客戶端要信任服務(wù)器證書,服務(wù)器驗(yàn)證客戶端證書來(lái)檢驗(yàn)客戶端身份的有效性。
|