1.引言
Web Services 通過一系列的標准技術,已成為企業實現面向服務的體系架構(Service Oriented Architecture,SOA)的首選。它實現了真正意義上的平台無關性和語言獨立性。隨著 Web Services 的應用越來越廣泛,其安全性和互操作性也變得越來越重要。於是關於 Web Services 安全和互操作方面的規范被制定出來並被不斷更新。
目前 Web Services 的安全規范有很多,包括 WS-Addressing,WS-Security,WS-Reliable Messaging (WS-RM),WS-Secure Conversation(WS-SC) 等,它們分別從不同的角度和范圍來保證 Web Services 的安全性。
由於 Web Services 安全規范涉及到消息的認證機制、機密性和完整性等各個方面,且可選擇的余地很大,因此不同應用服務器提供的對 Web Services 安全機制的支持也不盡相同。這樣,如何讓運行在不同應用服務器環境中的Web Services和Client 之間進行安全地互操作也成為問題。在 J2EE 和微軟的.Net 日益成為兩大主流平台的今天,解決它們之間的互操作更是成了眾多 web services 互操作標准的重要課題。微軟的Windows Communication Foundation V3.0(以下簡稱WCF)是一個用於創建和運行分布式系統的技術集合,是微軟為 SOA 而設計的一套完整的技術框架,它整合了 .Net 平台下以往全部的分布式開發技術。所以 J2EE和.Net 平台的互操作主要是和 .Net 上 WCF 應用的互操作。
為此,專門致力於提高互操作性的組織 Web Services Interoperability (WS-I)提出了一系列概要,包括 WS-I Basic Profile,WS-I Basic Secure Profile 等,表明為實現互操作,開發者及部署者應該如何使用各種 Web Services 標准。WAS V7.0 實現了對 WS-I Basic Security Profile 1.0 的完全支持,以及對 WS-I Basic Security Profile 1.1 的大部分支持。在支持 Web Services 的應用服務器中,WAS 對各種標准的支持是比較全面,比較早的。
WAS V7.0 中包含了一組 Java API for XML-Based Web Services (以下簡稱JAX-WS) 樣本程序,本文通過對樣本程序配置Web Service Secure Conversation 安全策略集,展示了如何在 WAS V7.0 和微軟的WCF 之間實現互操作性。
3.在上圖中,選擇證書(當前用戶)->個人->證書,右鍵點擊所有任務->導入,將 alice-key.p12 導入,提示密碼時,輸入 sampleapp。
4.接下來將 bob-cert.der 導入到證書(當前用戶)->受信任人->證書中。
5.再將 myca.cer 導入到受信任的根證書頒發機構中。
如果您要測試 JAX-WS Client 訪問 WCF Service 的例子,還需要完成以下操作:選文件-> 添加管理單元,在“獨立”選項卡上點“添加”,選擇“證書”->“計算機帳戶”,然後點“完成”。按上述步驟,將 bob-key.p12 導入到證書(本地計算機)的個人證書中。將 alice-cert.der 導入到證書(本地計算機)的受信任人的證書中。將 myca.cer 導入到證書(本地計算機)的受信任的根證書頒發機構中。
為 JAX-WS 應用導入證書
對於 JAX-WS Service,需要將 WCF Client 端的alice 的證書導入到 WAS 端的keystore 中。本文提供已經導好的jks 類型的keystore:receiver.jks,所以只需要將 mySysKeys.zip 拷貝到 WebSphere 服務器端,解開 mySysKeys.zip 到某個目錄即可。對於 JAX-WS Client 訪問 WCF Service 的情形,需要將 bob 的證書導入到 WAS 端的keystore 中,本文提供已經導好的keystore:sender.jks,同樣只需要放到 WAS 端某個目錄即可。
圖 2 是 WAS 管理控制台中關於服務配置的菜單。首先,在服務->策略集->系統策略集下通過復制 TrustServiceSecurityDefault 來創建一個名為 STSInterop 的系統策略集。在創建時,注意將“Attach this policy set in place of the original for all attached applications, services, endpoints, and operations”選框勾上。
然後在服務->信任服務->信任服務連接中,選中“發布令牌”和“更新”令牌,在指定綁定按鈕上,選“新建特定於信任服務的綁定”,創建一個名為 STSBinding 的綁定。為該綁定添加 WS-Addressing和WS-Security 服務特性。接下來要為該綁定的WS-Security 配置一些資源。如圖 3 所示。
圖 3.WS-Security 綁定配置菜單
點擊“認證和保護”,進入圖 4 所示的面板,可以看到,初始時各項資源的狀態都是“未配置”。
圖 4.WS-Security 認證和保護初始狀態
點 AsymmetricBindingInitiatorSignatureToken0, 將 JAAS login 設為 wss.consume.x509。如圖 5 所示。
圖 5.配置認證和保護中的簽名令牌
繼續點“應用”後,會發現上面的“回調處理程序”變亮,點擊進入圖 6。
圖 6.配置簽名令牌的回調處理程序
對於“證書庫”,選擇“無”;對於“信任錨庫”,點擊“新建”,進入圖 7 所示界面。
圖 7.配置回調程序所需的密鑰庫
輸入 STSTrustAnchor 作為名稱,選用外部密鑰庫,輸入 receiver.jks 所在的全路徑,密鑰庫類型為 JKS,密碼為 sampleapp 。點擊“確定”後完成。這樣我們就已經配好了 AsymmetricBindingInitiatorSignatureToken0。
回到“信任服務連接-> STSBinding -> WS-Security->認證和保護”界面(圖 8)。
圖 8.認證和保護主面板中的消息配置欄目
點“request:app_signparts”進入,輸入 req-sign-msg-part 作為名稱,點擊“應用”,進入圖 9。
圖 9.配置如何處理已簽名消息
再選中 request:app_signparts,點“編輯”,進入圖 10 界面。
圖 10.編輯 request:app_signparts
在“變換算法”下面點擊“新建”,進入圖 11。
圖 11.為 request:app_signparts 添加變換算法
其中,URL 選擇http://www.w3.org/2001/10/xml-exc-c14n#。點擊“確定”後,回到req-sign-msg-part 界面,進入圖 12。
圖 12.添加簽名密鑰
選中 req-sign-keyinfo,點擊“添加”,再“確定”。至此,我們已經配置完畢req-sign-msg-part 。回到“信任服務連接->STSBinding->WS-Security->認證和保護”界面,進入圖 13。
圖 13.配置完簽名令牌和簽名消息資源後的狀態
可以看到,我們一共配置了兩項簽名資源。這樣,service 端 bob 就能正確處理 alice 發送的簽名過的消息了。
接下來還需要配置加密相關的選項。過程與配置簽名類似,我們在此列出主要步驟:
在“信任服務連接-> STSBinding -> WS-Security->認證和保護”界面上,選 AsymmetricBindingRecipientEncryptionToken0,確保 JAAS login 設為 wss.comsume.x509。點擊“應用”後將產生一個回調處理程序。
配置回調處理程序:定制密鑰庫,同樣輸入 receiver.jks 所在的全路徑和密碼,類型為 JKS。提供密鑰名稱為“cn=bob,ou=myou,o=myco”,別名為 bob。因為 alice 是用 bob 的公鑰加密,所以此處配置的是 bob 的私鑰信息,用來解密 alice 發來的消息。
在“認證和保護”界面中選 Request message signature and encryption protection-> request:app encparts ,輸入名稱 req-enc-msg-part 。點“應用”。在密鑰信息中,選中“req-enc-keyinfo”,點“添加”,最後“確定”。
至此,bob 能正確處理 alice 發來的簽名和加密過的消息了。
然後,我們需要配置 response 消息相關的選項,以便 bob 能正確應答 alice ,和上面配置 request 消息類似,我們需要分別配置簽名相關的資源和加密相關的資源。同樣是在 WS-Security 的“認證和保護”面板中配置,具體過程不再累述,大家可以參照本文提供的配置文件進行操作。
安裝和配置 JAX-WS 應用程序
本例中,我們采用的是 WAS 自帶的JAX-WS 樣本程序 JaxWSServicesSamples ,在 <WAS_HOME>/samples/lib/JaxWSServiceSamples 下可以找到它的安裝包 JaxWSServicesSamples.ear 。在控制台上安裝時,注意選中“部署 web service”,其它按默認設置。
安裝完畢後,在管理控制台上選服務->服務提供者,可以看到下面圖 14 界面。
圖 14.JaxWSServiceSamples 中服務提供者列表
可以看到,JaxWSServiceSamples 中一共包含六個 web service,本例中我們只測試 EchoService ,所以下面只講解如何配置 EchoService 。
先在服務->策略集->應用程序策略集下通過復制 SecureConversation 的方式創建一個自己的策略集,名稱為 SCSvcInterop。
然後回到服務->服務提供者界面,選 EchoService 進入,先全選,再點擊“連接策略集”,選擇 SCSvcInterop,這樣 EchoService 將采用 SCSvcInterop 定義的服務特性。
然後在“指定綁定”中新建一個名為 SCSvcBinding 的綁定,為該綁定添加 WS-Addressing和WS-Security 。策略集和綁定指定完畢後的界面如圖 15。
圖 15.設置過策略集和綁定的web service
接下來的工作是配置 SCSvcBinding 中的WS-security 資源,過程同配置 STSBinding 類似,讀者可以參照本文提供的配置文件 bindings.xml 自行操作。
至此,WebSphere 應用服務器端的配置完畢,需要重啟 server 使之生效。
WCF 客戶端的配置
對於WCF應用,Microsoft Windows SDK 提供的程序 svcconfigeditor 可以圖形化地配置WCF 應用的各種屬性。在 <Microsoft SDKs_HOME>/Windows/v6.0A/bin 啟動該程序,打開 WCF 客戶端配置文件 WSWindowsClient.exe.config 。顯示界面如圖 16。
圖 16.用 svcconfigeditor 編輯 WCF 配置文件
下面列出主要配置過程,不一一圖解說明。
1.在左邊面板上選 Bindings EchoSOAP(customBinding) ,在右邊面板上設置 message version 為 Soap11WSAddressing10。
2.在左邊面板上選 Bindings->EchoSOAP(customBinding) ,右鍵選“Add Binding Element Extensions…”,在彈出的對話框中選 security,點“add”按鈕。
3.在左邊面板上選 Bingdings->EchoSOAP(customBinding) ->security ,添加安全屬性:
AuthenticationMode : SecureConversation
Default Algorithm : Basic128Rsa15
MessageSecurityVersion:
WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPo
licy11BasicSecurityProfile10
Require Signature Confirmation : True
SecurityHeaderLayout : Lax
4.在左邊面板上選Bingdings->EchoSOAP(customBinding) ->security ->secureConverstaionBootstrap ,在右邊設置:
AllowSerializedSigningTokenOnReply : True
AuthenticationMode : MutualCertificate
Default Algorithm : Basic128Rsa15
MessageSecurityVersion :
WSSecurity10WSTrustFebruaryWSSecureConversationFebruary2005WSS
ecurityPolicy11BasicSecurityProfile10
RequireSignatureConfirmation : False
5.在左邊面板上選 Advanced-> Endpoint Behaviors, 右鍵選“New Endpoint Behavior Configuration” ,輸入 Client-Cert-Behavior作為名稱。再點Client-Cert-Behavior ,右鍵選“Adding Behavior Element Extension”,在彈出對話框中選 clientCredentials ,點“Add”完成。
6.在左邊面板上選 Advanced-> Endpoint Behaviors->clientCredentials ->clientCertificate,在右邊設置:
FindValue: 12
X509FindType: FindBySerialNumber
7.在左邊面板上選 Advanced->Endpoint Behaviors->clientCredentials ->clientCertificate ->serviceCertificate->defaultCertificate,在右邊設置:
FindValue: 13
StoreName: TrustedPeople
X509FindType: FindBySerialNumber
8.在左邊面板上選 Advanced->EndpointBehaviors->clientCredentials ->clientCertificate ->serviceCertificate-> authentication ,在右邊設置:CertificateValidationMode :PeerTrust.
9.在左邊面板上選 Client->Endpoints->EchoServicePort ,在右邊設置:
Address: http://<hostname>:port/WSSampleSei/EchoService 此處的hostname和port 指向 WebSphere Application Server 端的EchoService。BehaviorConfiguration: Client-Cert-Behavior在 Identity 選項卡中,設置 DNS 為 Bob。
最後保存設置,退出 svcconfigeditor。
測試過程
在 windows 機器上運行 WCF 客戶端程序,在命令行下執行 WSWindowClient.exe –e,WCF 客戶端將會向 JAX-WS Service 發送一條消息 “HELLO”。如圖 17 所示。
圖 17.WCF Client 訪問 JAX-WS Service 測試過程
在 WebSphere 應用服務器端檢查 SystemOut.log ,可以發現 service 端收到消息並返回“JAX-WS==>>HELLO”。當然你也可以通過 -m 選項輸入自己的字符串作為消息。通過 –h 可以查看更多選項。
至此,我們驗證了 WCF Client 與 JAX-WS Service 之間的交互。如果讀者已配置了 WCF Service和JAX-WS Client ,則可驗證 WCF Service 與 JAX-WS Client 的交互。
結束語
隨著 Web Services 的應用越來越廣泛,各個對 Web Services 提供支持的應用服務器也越來越重視其互操作性。本文通過實例逐步介紹了如何在 WAS V7.0和.Net WCF V3.0 中正確配置 WS-Secure Conversation 安全策略集及其綁定,來實現 .Net WCF client和JAX-WS service之間的安全會話。WAS和WCF 互操作的關鍵是:首先要理解使用的MEPs,其次是正確配置 Web Service 的策略集和 WCF 綁定。希望本文能夠對您有所幫助。
本文配套源碼