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