本文介紹了如何對(duì) WebSphere Information Integrator Content Edition 的 SOAP 消息機(jī)制進(jìn)行改進(jìn),以提供消息完整性和保密性。本文還解釋了如何把 WebSphere IICE 現(xiàn)有的安全機(jī)制整合到 Web Services 安全實(shí)現(xiàn)中來(lái)。同時(shí),本文也是實(shí)現(xiàn) Web Services 安全機(jī)制的一次非常好的實(shí)踐。
安全已經(jīng)被公認(rèn)為是電子商務(wù)市場(chǎng)成功與否的關(guān)鍵因素之一,尤其是在分布式系統(tǒng)中的Web Services應(yīng)用。WebSphere Information Integrator Content Edition(以下簡(jiǎn)稱為WebSphere IICE)作為企業(yè)信息集成領(lǐng)域的領(lǐng)導(dǎo)者,提供了若干基于SOAP消息的服務(wù)。
本文介紹了如何對(duì)WebSphere IICE SOAP消息機(jī)制進(jìn)行改進(jìn),以提供消息完整性和保密性。這種機(jī)制包括使用XML 數(shù)字簽名對(duì)消息進(jìn)行簽名來(lái)達(dá)到消息完整性,和使用XML加密對(duì)消息進(jìn)行加密/解密來(lái)達(dá)到消息的保密性。本文還解釋了如何把WebSphere IICE現(xiàn)有的安全機(jī)制整合到Web Services安全實(shí)現(xiàn)中來(lái)。同時(shí),本文也是實(shí)現(xiàn)Web Services安全機(jī)制的一次非常好的實(shí)踐。它不僅能便捷的實(shí)現(xiàn)安全模型、安全算法的隨意擴(kuò)展而且本文的實(shí)現(xiàn)原理能方便的移植到IBM所有需要實(shí)現(xiàn)Web Services安全的產(chǎn)品中。
1. 背景介紹和動(dòng)機(jī)
WebSphere IICE作為企業(yè)信息集成的領(lǐng)導(dǎo)者,其基于J2EE框架的結(jié)構(gòu)通過(guò)擴(kuò)展SOAP消息接口實(shí)現(xiàn)了對(duì)Web Services的支持。它主要提供了三種SOAP服務(wù),并把它們命名為WebSphere IICE Web Services。這些服務(wù)-Web Services 接口、SOAP 客戶端代理和SOAP CONNECTOR代理-使得WEBSPHERE IICE能容易的部署在因特網(wǎng)中,并能被因特網(wǎng)中的其他服務(wù)訪問(wèn)。正是WebSphere IICE的這些特性不僅使得其各個(gè)分布式部件能異步的交互,而且還能使得WebSphere IICE各個(gè)分布式部件能無(wú)狀態(tài)的交互,從而省略了會(huì)話狀態(tài)管理,同時(shí)可以不必考慮實(shí)現(xiàn)服務(wù)的協(xié)議和服務(wù)的位置。
不幸的是,這種結(jié)構(gòu)松散、協(xié)議開(kāi)放的環(huán)境很容易被潛在的安全威脅所攻擊。一個(gè)Web Services消息在到達(dá)目的地之前要在很多個(gè)中間介質(zhì)中傳遞,這樣擁有一個(gè)成熟的消息層面的安全機(jī)制就變得格外重要。
現(xiàn)在的WebSphere IICE提供的解決SOAP消息在現(xiàn)實(shí)電子商務(wù)網(wǎng)絡(luò)環(huán)境中傳輸安全問(wèn)題的技術(shù)方案還存在一些不足,譬如安全算法簡(jiǎn)單,加密結(jié)構(gòu)靈活性有限等。
SOAP規(guī)范使得任何安全機(jī)制(數(shù)字簽名、信息完整性保護(hù)、加密/解密等)能方便的應(yīng)用到任何的基于Web Services的應(yīng)用程序中。
IBM已經(jīng)提供了一個(gè)完整的技術(shù)策略-WS-Security。這樣整個(gè)行業(yè)就能各自實(shí)現(xiàn)此基于標(biāo)準(zhǔn)的結(jié)構(gòu)來(lái)滿足現(xiàn)實(shí)商業(yè)中復(fù)雜的、靈活的Web Services安全需求。通過(guò)提升Web Service核心模塊的可擴(kuò)展性,我們可以獲得基于諸如SOAP、WSDL、XML數(shù)字簽名、XML加密/解密和SSL/TLS等核心技術(shù)的解決方案。這樣使得Web Services的提供者和需求者能根據(jù)各自的應(yīng)用程序安全需求來(lái)開(kāi)發(fā)解決方案。這些解決方案和標(biāo)準(zhǔn)使得我們能夠方便的把Web Services安全解決方案和WebSphere IICE Web Services部件整合在一起。
2. 實(shí)現(xiàn)原理
2.1 WebSphere IICE Web Servives概述
現(xiàn)在WebSphere IICE提供兩個(gè)層次的Web Services部件,一個(gè)是SOAP客戶端代理、SOAP connector代理和Web Services API,我們把這部分叫做WebSphere IICE Web Services客戶端:另外一部分是作為WebSphere IICE Web模塊發(fā)布的服務(wù)器端SOAP實(shí)現(xiàn)。此Web模塊把IICE接口作為Web Services發(fā)布出去并把這些接口和其他模塊整合在一起。從技術(shù)角度來(lái)講,WebSphere IICE Web Services部件利用了Apache Axis工具包。我們可以簡(jiǎn)單的把WebSphere IICE的兩部分理解為Axis客戶端和Axis服務(wù)器端。下面講述了WebSphere IICE Web Services部件的細(xì)節(jié)。
SOAP客戶代理層(如圖1部件1)應(yīng)用SOAP作為WebSphere IICE標(biāo)準(zhǔn)API和ACCESSSERVICES部件交互協(xié)議。
SOAP connector代理層(如圖1部件2)應(yīng)用SOAP作為ACCESSSERVICE EJB組件和已經(jīng)部署的CONNECTOR EJB部件的交互協(xié)議。此實(shí)現(xiàn)機(jī)制和SOAP客戶代理層的實(shí)現(xiàn)機(jī)制非常相象。

圖1:WebSphere IICE Web Services部件
Web Services調(diào)用接口(如圖1部件3)通過(guò)SOAP接口提供了WebSphere IICE整合接口的絕大部分內(nèi)容。它包括一個(gè)WSDL文件,此文件定義了調(diào)用接口并且提供了一種語(yǔ)言無(wú)關(guān)的方式來(lái)訪問(wèn) Internet 中非結(jié)構(gòu)化的數(shù)據(jù)。
2.2 WebSphere IICE密文登錄原理
WebSphere IICE加密機(jī)制是對(duì)BLOWFISH算法的一種實(shí)現(xiàn)。一旦安裝成功,WebSphere IICE會(huì)使用此算法產(chǎn)生一個(gè)密鑰文件同時(shí)要保證此文件在客戶端和CONNECTOR端的CLASSPATH中。如下是應(yīng)用BLOWFISH進(jìn)行加/解密的一個(gè)過(guò)程示例。
列表1:應(yīng)用blowfish進(jìn)行加、解密過(guò)程
客戶端的加密過(guò)程: ?? //Create and encrypt an AuthBundle. ?? AuthBundle aB = new AuthBundle(user, password); ?? try { ????? //Encrypt the auth bundle ????? (new BlowfishSealer()).seal(aB); ?? } catch(KeyNotFoundException knfe) { ????? ... ?? } ?? 服務(wù)器端的解密過(guò)程: ...use the sealed bundle to logon to a chosen repository. ????? .. ????? // Unseal the auth bundle if sealed. ????? if(authBundle.isSealed()) { ???????? // Instantiate an unsealer proxy. ???????? UnsealerProxy uP = new UnsealerProxy(); ???????? try { ??????????? // Attempt to unseal the bundle. ??????????? // The UnsealerProxy will delegate unsealing // to a new instance of "my.magic.Unsealer" ??????????? uP.unseal(authBundle); ???????? } catch(UnsealerNotFoundException unfe) { ??????????? throw new LogonException("Unable … unsealer.", unfe); ???????? } catch(KeyNotFoundException knfe) { ??????????? throw new LogonException("Unable ….", knfe); ???????? } catch(InvalidKeyClassException ikce) { ??????????? throw new LogonException("Invalid decryption...", ikce); ???????? } catch(EncryptionException ee) { ??????????? throw new LogonException("An error ….", ee); ???????? } ????? } ????? ... |
2.3 WebSphere IICE Web Services SOAP消息安全概述
由于WebSphere IICE使用Axis作為SOAP引擎,我們首先需要了解一下Axis的機(jī)制。可以說(shuō),Axis的任務(wù)就是處理消息。當(dāng)Axis的核心處理邏輯啟動(dòng)時(shí),一系列的句柄會(huì)被順序的調(diào)用。調(diào)用的順序是由兩個(gè)因素來(lái)決定的--部署文件和此引擎為客戶端還是服務(wù)器端。
WebSphere IICE Web Services會(huì)被一系列的客戶端和服務(wù)器端Axis/JAX-RPC句柄處理。為了能使此安全解決方案正常工作,這些句柄必須被安裝并且要保證安裝順序正確。本文提供了兩套句柄分別實(shí)現(xiàn)消息的加密/解密和消息完整性驗(yàn)證功能,同時(shí)要保證這四個(gè)句柄被正確的安裝在客戶端和服務(wù)器端的WSDD配置文件中,這樣才能保證對(duì)于每一個(gè)從客戶端發(fā)出的消息都被客戶端的證書(shū)加密和簽名,同時(shí)才能保證服務(wù)器端接受到的每一個(gè)消息都是被驗(yàn)證的而且每一個(gè)消息都經(jīng)過(guò)了解密。這樣我們就實(shí)現(xiàn)了SOAP消息的完整性和機(jī)密性。
同時(shí),用戶可以選擇是否使用此安全機(jī)制。如果用戶傾向于非安全機(jī)制,他所需要做的就是注釋客戶端和服務(wù)器端的WSDD配置文件。
2.4 WEBSPHERE IICE WEB SERVICE SOAP消息安全實(shí)現(xiàn)細(xì)節(jié)
A. 配置
WebSphere IICE Web Services安全機(jī)制的配置工作是由客戶端和服務(wù)器端兩部分組成的。就如下面的配置文件實(shí)例說(shuō)描述的一樣,SOAP消息會(huì)在它被發(fā)送到目標(biāo)服務(wù)器之前分別被不同的句柄簽名和加密。相對(duì)應(yīng)的,它也會(huì)在服務(wù)器端被驗(yàn)證和解密。
列表2:AXIS客戶端配置文件示例
<globalConfiguration> ????? <requestFlow>???? ????? <handler ?? type="java:com.venetica.vbr.webservices.handler.X509SignHandler"/> ????? <handler ?? type="java:com.venetica.vbr.webservices.handler.EncryptHandler"/>????? ?? </requestFlow>?? ?? <responseFlow> ??? <handler ?type="java:com.venetica.vbr.webservices.handler.X509SignHandler"/> ??? <handler ?type="java:com.venetica.vbr.webservices.handler.DecryptHandler"/> ?? </responseFlow>?? ?</globalConfiguration> |
服務(wù)器端的配置文件和客戶端的配置文件非常相像。
B. 簽名和加密/解密過(guò)程:
SOAP消息的簽名和加密/解密過(guò)程如圖2所示:

圖2:SOAP消息的簽名和加密/解密過(guò)程
列表3: XML簽名示例代碼
public Message signSOAPEnvelope(SOAPEnvelope unsignedEnvelope) throws Exception ?? {? // WSSignEnvelope signs a SOAP envelope according to the ????? // WS Specification (X509 profile) and adds the signature data ????? // to the envelope. ????? WSSignEnvelope signer = new WSSignEnvelope(); ????? String alias = "username"; ????? String password = "password"; ????? signer.setUserInfo(alias, password); ????? Document doc = unsignedEnvelope.getAsDocument();???? ????? Document signedDoc = signer.build(doc, crypto); ????? // Convert the signed document into a SOAP message. ????? Message signedSOAPMsg =???????? (org.apache.axis.Message)AxisUtil.toSOAPMessage(signedDoc); ????? return signedSOAPMsg; ?? } |
列表3顯示了XML簽名的過(guò)程:首先得到SOAP信封,接下來(lái)是獲得用戶證書(shū)信息、產(chǎn)生簽名對(duì)象,然后是用此簽名對(duì)象對(duì)信封進(jìn)行簽名,最后是從被簽名的信封中產(chǎn)生新的SOAP消息。
列表4:XML加密示例代碼
public Message encryptSOAPEnvelope( ????? SOAPEnvelope unsignedEnvelope, Message axisMessage) ????? throws Exception ?? { ????? WSEncryptBody encrypt = new WSEncryptBody(); ????? // build the encrypted SOAP part ????? Document doc = unsignedEnvelope.getAsDocument(); ????? Document encryptedDoc = encrypt.build(doc, crypto); ????? // Convert the document into a SOAP message ????? Message encryptedMsg = ???????? (Message)AxisUtil.toSOAPMessage(encryptedDoc); ????? // Retrieve the desired SOAP part ????? String soapPart = encryptedMsg.getSOAPPartAsString(); ????? ((SOAPPart)axisMessage.getSOAPPart()). setCurrentMessage(soapPart, SOAPPart.FORM_STRING); ????? encryptedDoc =axisMessage.getSOAPEnvelope().getAsDocument(); ????? // Convert the document into a SOAP message ????? Message encryptedSOAPMsg = Message)AxisUtil.toSOAPMessage(encryptedDoc); ????? return encryptedSOAPMsg; ?? } |
列表4顯示了加密過(guò)程:首先獲得加密前的SOAP信封,接下來(lái)獲得用戶的證書(shū)信息并以此產(chǎn)生加密對(duì)象,然后是應(yīng)用此加密對(duì)象對(duì)獲得的SOAP信封進(jìn)行加密,最后為根據(jù)被加密之后的SOAP消息產(chǎn)生新的SOAP消息并向下傳遞。
C. 消息對(duì)比:
圖3和圖4分別顯示了簽名消息和加密消息的對(duì)比情況。

圖3:應(yīng)用數(shù)字簽名前后SOAP消息對(duì)比

圖4:應(yīng)用安全加密前后SOAP消息對(duì)比
3. 益處
- A 本實(shí)踐不僅有效的提高了WebSphere IICE Web Services SOAP消息的安全性,而且滿足了對(duì)用戶具有很大意義的新需求。
- B 本實(shí)踐提供了一個(gè)實(shí)現(xiàn)當(dāng)前最新的、炙手可熱的Web Services安全標(biāo)準(zhǔn)并把它應(yīng)用于IBM產(chǎn)品的示例。
- C 本實(shí)踐提供了怎樣把當(dāng)前較新的技術(shù)和IBM已有的解決方案整合在一起來(lái)滿足用戶新的需求的示例。
- D 本實(shí)踐很好的顯示了怎樣在使用Web Services技術(shù)的IBM產(chǎn)品中應(yīng)用Web Services安全。
- E WebSphere IICE安全實(shí)現(xiàn)機(jī)制擁有良好可擴(kuò)展性。
4. 結(jié)論
本實(shí)踐對(duì)WebSphere IICE的Web Services SOAP消息安全機(jī)制進(jìn)行了改良。同時(shí)提供了一個(gè)把最新技術(shù)標(biāo)準(zhǔn)應(yīng)用于IBM產(chǎn)品的示例。這樣不僅滿足了用戶新的需求而且很好的擴(kuò)展了IBM產(chǎn)品的應(yīng)用場(chǎng)景。