WSP0075:策略断言“TransportBinding”被评估为“未知”。为什么?

时间:2014-09-04 22:56:58

标签: wsdl cxf jax-ws soap-client wsdl2java

我是我无法控制的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".

然而,客户端工作正常 - 我在使用该服务时没有任何问题。但是,我对这些错误感到困惑。

错误是关于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>

然而,据我所知,这是一个完全普通的政策,并没有什么不寻常之处。当然应该理解?我该如何修复此警告?

为了记录,这里是如何调用wsdl2java(摘自pom.xml)。

-exsh true arg和cxf-rt-bindings-soap依赖是因为WSDL在其参数中使用了一些隐式soap头,我需要这样,以便它们被正确地包含在生成的服务类方法中。

我添加了cxf-rt-ws-securitycxf-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>

4 个答案:

答案 0 :(得分:9)

通过猜测并查看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)
    ...

这很可能是由于Willie Wheeler的回答指出:该策略要求传输上的256位加密,但该服务的SSL使用128位加密。但是,使用带有Base128的wsdl不能解决此异常,我没有进一步调查。

因此,使用此服务的每个人都可能会收到此警告或类似内容,并且如果实际检查安全策略,则无法使用此服务。我想我会生活在警告中。

答案 1 :(得分:7)

我可以使用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".                                                                                  

我认为问题在于您上面列出的政策需要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位加密,但由于该服务不支持它,客户端正在选择较弱的加密算法。

由于这是服务方面的问题,解决此问题的最佳方法可能是通知负责该问题服务的一方。

答案 2 :(得分:2)

我发现在SOAP请求被发送之前就记录了这些错误。

这些警告没有出现在Java 6中。它们确实出现在Java 7和Java 8中。我的预感是这些警告与我的源代码中的旧版jaxrpc.jar有关。

我的&#34; hack&#34;解决方法是下载WSDL文件的副本并修改策略部分。然后将我的web服务中的主类指向此修改后的WSDL文件。

//Modified tags in my main class. Change the wsdlLocation to point to a file in my source code (instead of a URL)
@WebServiceClient(name = "Service1", targetNamespace = "https://example.org/", wsdlLocation = "WebService.wsdl")
public class Service1
...

修改了WebService.wsdl文件:

<wsp:Policy wsu:Id="BasicHttpBinding_IService1_policy">
    <wsp:ExactlyOne/>
</wsp:Policy>

答案 3 :(得分:0)

最后找到了正确的解决方案:

您缺少提供PolicyAssertionValidator实现以验证名为{http://schemas.xmlsoap.org/ws/2005/07/securitypolicy}TransportBinding的策略的依赖项。

要使用的正确依赖项是org.glassfish.metro:wssx-impl。该库提供了一个名为SecurityPolicyValidator的类,可以验证所述策略。只要将该库放在您的类路径中,它就会自动工作。

此解决方案应同时适用于JAX-WS堆栈和Apache CXF。