当前位置: 首页 > 知识库问答 >
问题:

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

戎志勇
2023-03-14

我正在学习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。属性文件,并放置在我的项目的src目录中。

但每当我运行这个客户机时,SOAP请求消息都没有加密。所以在服务器端我遇到了这样的异常

无法满足这些政策选择:{http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}加密部件{http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}签名部件

下面是我的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个答案

法浩壤
2023-03-14

我遇到了同样的问题,经过多次实验,下面的指南每次都会有所帮助。

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

注:安全性。签名财产和安全。加密。属性也可以外部化,并直接用xml值中的绝对路径引用。

华甫
2023-03-14

确保您使用的是正确的库。尝试仅包含cxf bundle,删除其他cxf依赖项如果您使用的是maven,如下所示:

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-bundle</artifactId>
    <version>2.7.18</version>
</dependency>
钱焕
2023-03-14

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

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

另请阅读url中的“启用WS-SecurityPolicy”部分http://cxf.apache.org/docs/ws-securitypolicy.html

我希望这有帮助

 类似资料:
  • 我有以下Java客户端用于发出SOAP请求: 我需要修改它,将用户名和密码作为WS-security标头的一部分。我该怎么做呢? 如果有用,我还附加了我的WSDL文件:

  • 问题内容: 我正在尝试用两个客户端实现一个系统,其中一个客户端发送一条消息,而另一个客户端将接收该消息。下图将以更直观的方式对其进行解释: 因此,客户端1将消息发送到服务器(此工作正常),服务器接收到“推送”消息并发出应由客户端2接收的“弹出”消息。这里的问题是客户端2从未收到“流行”消息。:( 这是所有代码。 SERVER.JS 客户1(aka mobile.html) 客户2(aka web.

  • 客户端的HTTP/HTTPS请求。 进程:主进程​ ClientRequest是由EventEmitter来实现Writable Stream​ new ClientRequest(options) 作用:发起新的HTTP/HTTPS请求 options(Object | String) - options是String时即请求URL。 options 是Object时则按以下属性请求: meth

  • 我正在尝试使用HTTP请求/响应用Java编写一个简单的客户机-服务器应用程序。我想客户端是一个桌面程序发送(张贴)请求到服务器。该服务器是一个网页,将被托管在Apache Tomcat服务器上。服务器必须能够读取信息并将其显示在浏览器上,并且必须能够用状态代码200响应客户端。我正在使用eclipse和Apache tomcat服务器。到目前为止,我已经尝试了各种资源,但我所能找到的是一个可以从

  • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se

  • httplib 库主要用来模拟客户端发送 HTTP 请求,类似于 Curl 工具,支持 JQuery 类似的链式操作。使用起来相当的方便;通过如下方式进行安装: go get github.com/astaxie/beego/httplib 如何使用 首先导入包 import ( "github.com/astaxie/beego/httplib" ) 然后初始化请求方法,返回对象 r