Fra*_*ila 15 wsdl cxf wsdl2java jax-ws soap-client
我是一个我无法控制的SOAP服务的客户端(在.NET中实现).该服务提供WSDL.我使用Apache CXF从WSDL生成java客户端(具体来说,我使用的是Maven的cxf-codegen-plugin,它使用了wsdl2java).
但是,当我实例化生成的服务类时,会记录以下警告:
Sep 04, 2014 5:18:00 PM [com.sun.xml.internal.ws.policy.EffectiveAlternativeSelector] selectAlternatives
WARNING: WSP0075: Policy assertion "{http://schemas.xmlsoap.org/ws/2005/07/securitypolicy}TransportBinding" was evaluated as "UNKNOWN".
Sep 04, 2014 5:18:00 PM [com.sun.xml.internal.ws.policy.EffectiveAlternativeSelector] selectAlternatives
WARNING: WSP0019: Suboptimal policy alternative selected on the client side with fitness "UNKNOWN".
Run Code Online (Sandbox Code Playgroud)
但是客户端工作正常 - 我使用该服务没有任何问题.但是,我对这些错误感到困惑.
错误是关于WSDL中的这个安全策略,我认为它说它无法理解:
<wsp:Policy wsu:Id="soap11_policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
<wsp:ExactlyOne>
<wsp:All>
<sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<wsp:Policy>
<sp:TransportToken>
<wsp:Policy>
<sp:HttpsToken RequireClientCertificate="false"/>
</wsp:Policy>
</sp:TransportToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic256/>
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:Layout>
<wsp:Policy>
<sp:Strict/>
</wsp:Policy>
</sp:Layout>
</wsp:Policy>
</sp:TransportBinding>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
Run Code Online (Sandbox Code Playgroud)
但据我所知,这是一个完全普通的政策,并没有什么不寻常之处.当然应该理解?我该如何修复此警告?
为了记录,这里是如何调用wsdl2java(摘自pom.xml).
该-exsh trueARG和cxf-rt-bindings-soap依赖是因为WSDL使用了一些隐含的SOAP消息头中的参数,我需要这使它们在生成的服务类的方法妥善包括在内.
我加入了cxf-rt-ws-security和cxf-rt-ws-policy依赖关系,试图解决这个问题的警告,认为也许没有包括安全和策略信息.然而,这并没有解决任何问题(尽管如此,也没有破坏任何东西).
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>rh-soap-client-ssi</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${project.build.directory}/generated/cxf</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>https://example.org/ssi?wsdl</wsdl>
<extraargs>
<extraarg>-verbose</extraarg>
<extraarg>-client</extraarg>
<extraarg>-mark-generated</extraarg>
<extraarg>-exsh</extraarg>
<extraarg>true</extraarg>
<extraarg>-autoNameResolution</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-bindings-soap</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-security</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-policy</artifactId>
<version>3.0.1</version>
</dependency>
</dependencies>
</plugin>
Run Code Online (Sandbox Code Playgroud)
Fra*_*ila 12
通过猜测和查看maven中心的文物,我能够找到解决方案.
事实证明,为了实际理解和评估此wsdl中的策略,必须提供缺少的运行时依赖性.对我来说,它是org.apache.cxf/cxf-rt-frontend-jaxws.我无法在任何地方找到这个记录.这会引入许多其他cxf依赖项,我不知道它们是否可以使用更少的一组.
一旦我包含此依赖项,我在实例化客户端对象时不再收到警告.(另外,实例化需要更长的时间!)
但是,当我尝试使用该服务时,我得到一个例外:
javax.xml.ws.soap.SOAPFaultException: None of the policy alternatives can be satisfied.
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:159)
...
Run Code Online (Sandbox Code Playgroud)
这很可能是因为Willie Wheeler的回答指出:该策略要求传输上的256位加密,但该服务的SSL使用128位加密.但是,使用wsdl Base128代替不能解决此异常,我没有进一步调查.
因此,使用此服务的每个人很可能会收到此警告或类似的警告,如果实际检查安全策略,则无法使用此服务.我想我会生活在警告中.
我可以使用Express-1标签服务重现此问题:
2014-09-10 22:15:29.601 WARN 6564 --- [ main] c.s.x.i.w.w.EffectiveAlternativeSelector : WSP0075: Policy assertion "{http://schemas.xmlsoap.org/ws/2005/07/securitypolicy}TransportBinding" was evaluated as "UNKNOWN".
2014-09-10 22:15:29.602 WARN 6564 --- [ main] c.s.x.i.w.w.EffectiveAlternativeSelector : WSP0019: Suboptimal policy alternative selected on the client side with fitness "UNKNOWN".
Run Code Online (Sandbox Code Playgroud)
我认为问题在于您上面列出的策略需要Basic256消息加密,但服务的SSL加密较弱.
例如,看看这个WSDL:
https://service.express1.com/Services/EwsLabelService.svc?wsdl
在最顶层,您将看到与您提供的政策相同的政策.但是,如果您查看该站点的SSL证书,它将使用AES_128_CBC,它只是128位加密.
有关TransportBinding策略和算法套件的信息,请参阅http://specs.xmlsoap.org/ws/2005/07/securitypolicy/ws-securitypolicy.pdf,第7.1,8.1和8.3节.我相信警告说的是该策略需要256位加密,但由于该服务不支持它,客户端正在选择较弱的加密算法.
由于这是服务方面的问题,解决问题的最佳方法可能是通知负责该问题服务的一方.
最终找到了正确的解决方案:
PolicyAssertionValidator您缺少一个依赖项,该依赖项提供了用于验证 name 策略的实现{http://schemas.xmlsoap.org/ws/2005/07/securitypolicy}TransportBinding。
使用的正确依赖项是org.glassfish.metro:wssx-impl。该库提供了一个名为 的类SecurityPolicyValidator,可以验证所述策略。只需将库放在类路径中即可自动工作。
该解决方案应该适用于 JAX-WS 堆栈和 Apache CXF。
| 归档时间: |
|
| 查看次数: |
15931 次 |
| 最近记录: |