2.4 WEBSPHERE IICE WEB SERVICE SOAP消息安全实现细节
		  A. 配置
		  WebSphere IICE Web Services安全机制的配置工作是由客户端和服务器端两部分组成的。就如下面的配置文件实例说描述的一样,SOAP消息会在它被发送到目标服务器之前分别被不同的句柄签名和加密。相对应的,它也会在服务器端被验证和解密。
		  列表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>
 | 
				
		
		  服务器端的配置文件和客户端的配置文件非常相像。
		  B. 签名和加密/解密过程:
		  SOAP消息的签名和加密/解密过程如图2所示:
		
				 
		
		  图2:SOAP消息的签名和加密/解密过程
		  列表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签名的过程:首先得到SOAP信封,接下来是获得用户证书信息、产生签名对象,然后是用此签名对象对信封进行签名,最后是从被签名的信封中产生新的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;
 }
 |