我正在学习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。我不知道什么是错的。请帮帮我。
答案 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)
我遇到了同样的问题,经过大量的实验,以下准则每次都可以提供帮助。
注意: 也可以将security.signature.properties和security.encryption.properties外部化,并使用xml值中的绝对路径直接引用。