CXF Web服务客户端不加密SOAP请求XML消息

时间:2013-03-22 12:35:25

标签: cxf xml-encryption

我正在学习Webservice安全性。我正在使用CXF框架。我已经开发了一个测试服务,它只会将我们发送的任何值加倍。基于本教程

我已经添加了用于XML加密和签名的WS-Policy。

然后我使用CXF开发了这项服务的Web服务客户端作为eclipse项目。 以下是我的客户端配置文件

<jaxws:client id="doubleItClient" serviceClass="com.DoubleIt" address="http://localhost:8080/myencws/services/DoubleItPort?wsdl">
<jaxws:features>
            <bean class="org.apache.cxf.feature.LoggingFeature" />
</jaxws:features>

 <jaxws:properties>
            <entry key="ws-security.callback-handler" value="com.ClientKeystorePasswordCallback"/>        
            <entry key="ws-security.encryption.properties" value="com/clientKeystore.properties"/>
            <entry key="ws-security.signature.properties" value="com/clientKeystore.properties"/>
            <entry key="ws-security.encryption.username" value="myservicekey"/>
 </jaxws:properties>

我已生成所有密钥库文件,并创建了clientKeystore.properties文件并放在项目的src目录中。

但是每当我运行此客户端时,SOAP请求消息都没有加密。所以客栈服务器方面我得到了像

这样的例外
  

这些政策选择无法满足:   {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702} EncryptedParts和   {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}和SignedParts

以下是我的SOAP请求

<soap:Envelope
 xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:doubleValue
 xmlns:ns2="http://com/"><arg0>5</arg0></ns2:doubleValue></soap:Body></soap:Envelope>

我正在使用CXF2.7.3。我不知道什么是错的。请帮帮我。

3 个答案:

答案 0 :(得分:0)

我之前的代码有类似的问题,缺少的是jar依赖项,当客户端从WSDL读取安全策略时,它会执行实际加密。

我的修复是在POM中添加某些maven依赖项以启用加密。检查此网址:http://cxf.apache.org/docs/using-cxf-with-maven.html

另请阅读网址http://cxf.apache.org/docs/ws-securitypolicy.html

中的“启用WS-SecurityPolicy”部分

我希望这会有所帮助

答案 1 :(得分:0)

确保使用正确的库。尝试仅包含cxf包,删除其他cxf依赖项 如果您正在使用maven,请执行以下操作:

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-bundle</artifactId>
    <version>2.7.18</version>
</dependency>

答案 2 :(得分:0)

我遇到了同样的问题,经过大量的实验,以下准则每次都可以提供帮助。

  1. 构造您的cxf客户端配置xml,以导入META-INF cxf.xml。
  2. 定义cxf总线功能(用于记录)
  3. 定义http管道(如果TLS握手等需要)
  4. jaxws:具有名称属性为{targetNameSpaceWSDL)/ PortName且createdFromAPI = true和abstract = true的客户端bean
  5. 使客户端标签包含jaxws功能。记住要使用最新的“安全性”,而不要使用“ ws-security”
  6. 在您的Java客户端类中,使用SpringBus加载cxf客户端配置xml。SVN Link for SpringBus Client Config
  7. 确保在类路径中存在所有WS策略处理所需的依赖项,例如cxf-rt-ws-policy和cxf-rt-ws-security.jar以及如有需要的bouncycastle提供程序

注意: 也可以将security.signature.properties和security.encryption.properties外部化,并使用xml值中的绝对路径直接引用。