为了演示MLS,下面的例子对一个样本性的SOAP/HTTP消息进行了加密。这个作为示例用的是一个简单的计算器服务,其界面包括一个可以接受两个数字的乘法方法,还有一个使用Xfire and WSS4JJ框架的Java客户端。
下面列示计算器服务的客户端加密代码:
protected static void configureEncryption(Properties config)
{
// Encrypt action
config.setProperty(WSHandlerConstants.ACTION, WSHandlerConstants.ENCRYPT);
//The property file describes the public key used for encryption
config.setProperty(WSHandlerConstants.ENC_PROP_FILE,
"com/dev/ws/client/driver/outsecurity_enc.properties");
config.setProperty(WSHandlerConstants.ENCRYPTION_USER, "serveralias");
// The encryption algorithm
config.setProperty(WSHandlerConstants.ENC_SYM_ALGO,WSConstants.TRIPLE_DES);
// Encryption Key Identifier Types
config.setProperty(WSHandlerConstants.ENC_KEY_ID, "SKIKeyIdentifier");
// Encrypt the SOAP body
String bodyPart = "{Content}{}Body";
config.setProperty(WSHandlerConstants.ENCRYPTION_PARTS, bodyPart);
} |
注意:客户端的密钥存储配置包含在属性文件outsecurity_enc.properties中。这个属性文件就如下面的显示一样描述了密钥存储的位置和证书:
org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type=jks
org.apache.ws.security.crypto.merlin.keystore.password=keystorePass
org.apache.ws.security.crypto.merlin.alias.password=client344Password
org.apache.ws.security.crypto.merlin.keystore.alias=serveralias
org.apache.ws.security.crypto.merlin.file=com/dev/ws/client/driver/clientStore.jks |
一旦客户端和服务器配置完毕,运行客户端就会在TCP/IP监视器上产生如下的SOAP消息:
<soap:Envelope ...>
<soap:Header>
<wsse:Security ...>
<xenc:EncryptedKey ...>
<xenc:EncryptionMethod
Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<ds:KeyInfo ...>
...
</ds:KeyInfo>
<xenc:CipherData>
<xenc:CipherValue>
M+Tp2Q4ZtBJtpT1q7SkOALNnpv57Cgh/4EHV0gHONtUZsYQLIVYYWNdYqIkjb81pgxBFU94WKQK
au2BEZbF8rL4KdA9tdfb3McRzCOJDcGl4eDs2FC1Pe1Bj0b2VJ+m4D83EhGSsUEeItp+SZcF0Kw
jh5dEcV61Q4cscMZaruSg=
</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedKey>
<xenc:EncryptedData ...>
<xenc:CipherData>
<xenc:CipherValue...>
P8D3xHloRUSCvMA7gNaezLTtENS2R6oXJ8jByaBKvBl5t4joml2qIo9V2LXsnM3nuYJun2UADKfg...
</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedData>
</wsse:Security>
</soap:Header>
<soap:Body>
<xenc:EncryptedData ...>
<xenc:CipherData ...>
<xenc:CipherValue ...>
dIxwIHuC9TCLbSmfsgohBr2A81lY+GfPA7lofgXPcMvcblO+hOVeiKMyxXvuZF8M2fEtmHTa3kVY
fNDYFAKauoDwq4lWBKMuk4f0s8mTkhyBJrMmbD2mrw==
</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedData>
</soap:Body>
</soap:Envelope> |
这个SOAP消息现在已经被加密,并且明文已经被其密码数值所替换。这个SOAP报头包含着加密方法的信息。
本示例演示了一个大体的配置,它需要使用消息级安全(Message Level Security)来执行加密。虽然消息级安全与TLS相比,在性能和对端到端的安全性的支持方面拥有十分确定的优越性,你必须考虑它本身所带来的额外的复杂性。对于许多应用程序来说,对这种精细的和端到端的消息安全的支持并非关键所在,而TLS就算是一个在保密和加密方面不错的方案了。
下一节我们将讨论身份验证问题并且讨论一个最简单的方案:UsernameToken身份验证。(责任编辑:李磊)