cxf ws-security 加密和签名的实现
以下文章为 cxf 官方 google 翻译,英文好的朋友可以直接看原文:
http://cxf.apache.org/docs/ws-security.html
?
WS - Security提供了手段,以确保您的服务,如HTTPS传输级别的协议超出。 通过一些标准,如XML加密,并在WS - Security标准中定义的头,它可以让你:
在服务之间传递的身份验证令牌 对信息进行加密或部分消息 登录消息 时间戳消息目前,CXF的实现结合的WS - Security WSS4J 。 要使用的集成,你需要配置这些拦截器,并将它们添加到您的服务和/或客户。
?
加密和签名的概述
WS - Security的公共/私人密钥加密技术的大量使用。 要真正了解如何配置的WS - Security,它是有用的 - 如果没有必要 - 要了解这些基础知识。 维基百科在此有一个极好的入门 ,但我们会尝试总结了相关的基础知识(此内容是维基百科的内容修改后的版本.. )
与公共密钥加密,用户有一对公钥和私钥。 这些都是用一个大素数和一个关键功能。

键是有关数学的,但不能从一个派生。 与这些键,我们可以对信息进行加密。 例如,如果Bob想将消息发送给Alice,他可以用她的公钥加密消息。 然后,Alice可以解密此消息使用她的私钥。 只有Alice可以解密此消息,因为她是用私钥只有一个。

?信息也可以签署。 这使您可以确保消息的真实性。 如果Alice想将消息发送给Bob,Bob想确保它是从Alice,Alice可以使用自己的私钥来签名消息。 然后,Bob可以确认该消息是从Alice用她的公钥。

配置WSS4J拦截
为了使内CXF的WS - Security的服务器或客户端,你需要成立WSS4J拦截。 您可以通过API独立的Web服务或通过Spring XML配置servlet的主办。 本节将提供一个概述如何做到这一点,以下各节将进入更详细的拦截器配置为特定的安全行动。
重要的是要注意:
- 如果你是使用CXF 2.0.x的,你必须添加SAAJ(IN / OUT)拦截器,如果你使用WS - Security(自动为你这样做是CXF的2.1起)。 这些使创建为每个请求/响应的DOM树。 WS - Security的支持库需要DOM树。 Web服务提供者可能并不需要和WS -安全拦截。 例如,如果你只是需要传入消息的签名,Web服务提供者将只需要传入WSS4J拦截的SOAP客户端只需要传出。
?
通过API添加拦截器
在服务器端,你将要添加的拦截您的CXF的端点。 如果你使用的JAX - WS的API发布您的服务,你可以得到你这样的CXF的端点:
?
?
参数的构造元素以上(行动,signaturePropFile等)映射到WSS4J的文本字符串的输入键和值WSHandlerConstants和WSConstants您在下面的章节中看到相应WSHandlerConstants.XXXXX和WSConstants.XXXX的常量类。
?
因此,通过观察WSHandlerConstants,例如,你可以看到以下的WSHandlerConstants.USERNAME_TOKEN值将需要“的UsernameToken”,而不是在做Spring配置。
?
如果你想避免WSHandlerConstants.XXXXX WSConstants.XXXX常数的文字键,你也可以使用Spring UTIL命名空间,在Spring上下文中引用静态常量,如下图所示。
?
配置WS - Security的动作
?
用户名令牌认证
WS - Security支持指定标记的方法很多。 其中之一是的UsernameToken头。 它是一种标准的方式传达到另一个端点的用户名和密码或密码消化。 一定要检讨绿洲UserNameToken配置文件规范为重要的安全考虑,在使用UsernameTokens时。 注意规范的建议,为防范重放攻击,nonce的支持尚未得到落实CXF或WSS4J。
对于服务器端,你需要设置以下WSS4JInInterceptor属性(见上面的代码示例):
?
??别名,是一个简单的的方法来确定密钥对。 在这种情况下,我们使用的是RSA算法。
?
2。 自签署的证书(在生产环境中,这将是做一个像VeriSign这样的公司)。
?
提示为X.509的支持,您将通常有多个动作,例如加密与签名。 对于这些情况,只是空间独立的行动,在ACTION属性如下:
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 = amex123 org.apache.ws.security.crypto.merlin.file = server_keystore.jks加密
加密涉及的发件人与收件人的公钥加密的消息,以确保,只有收件人可以读取消息(只有收件人有其自己的私人密钥,解密消息所必需的。)这要求发件人以有收件人的公钥在其密钥库。
?
?
用于加密的过程是非常相似,的确通常与上面的签名过程中结合。 我们的WS - Security的测试样品提供了一个加密的请求和响应的例子, 还要检查这个博客条目月底到年底更显示SOAP请求和响应的签名和加密的例子。
?
?
以下是本人参照的几个网址:
?
http://www.benmccann.com/dev-blog/apache-cxf-tutorial-ws-security-with-spring/
http://cxf.apache.org/docs/ws-security.html
http://blog.csdn.net/kunshan_shenbin/article/details/3813000
http://www.ibm.com/developerworks/cn/java/j-jws13.html?ca=drs-cn-0419 ?
http://www.benmccann.com/dev-blog/apache-cxf-tutorial-ws-security-with-spring/
?