【问题标题】:WSP0075: Policy assertion "TransportBinding" was evaluated as "UNKNOWN". Why?WSP0075:策略断言“TransportBinding”被评估为“未知”。为什么?
【发布时间】:2014-10-29 20:06:46
【问题描述】:

我是不受我控制的 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>

【问题讨论】:

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


    【解决方案1】:

    我可以使用 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 位加密,但由于服务不支持它,客户端正在选择较弱的加密算法。

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

    【讨论】:

    • 嗯。您可以尝试自签名 256 位证书并查看会发生什么。或者确保您使用的 128 位加密属于“基本”类别。您使用的具体 128 位加密算法是什么?尝试将其用作 alg 套件策略。有关 alg 缩写,请参阅我发布的规范的第 7.1 节。
    • 我认为您正在做一些事情——我的端点在其 SSL 上也有 128 位加密。但是,当我覆盖 WSDL 以使用 Basic128 或删除 AlgorithmSuite 时,没有任何变化。只有当我删除整个 TransportBinding 部分时,警告才会消失。此外,如果这是我希望UNSUPPORTED 而不是UNKNOWN 的问题。会不会是策略评估者不知道传输,所以 any TransportBinding 部分会导致 UNKNOWN 警告?这再次让我觉得我缺少一些运行时依赖项。
    • 您使用的是哪种加密算法? (不仅仅是位长,还有算法。)是 ​​AES 还是其他什么?
    • AES_128_CBC,和你一样。但理论上从策略中删除 AlgorithmSuite 应该会删除警告,对吧?
    • 找到了解决方案:它缺少运行时依赖项。不过感谢您的帮助!
    【解决方案2】:

    通过猜测和查看 maven Central 中的工件,我找到了解决方案。

    事实证明,为了真正理解和评估此 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 并不能解决此异常,因此我没有进一步调查。

    所以很有可能每个使用此服务的人都可能会收到此警告或类似警告,如果实际检查了安全策略,则无法使用此服务。我想我会接受警告。

    【讨论】:

    • 很高兴知道。感谢联合调查。
    • 那么,您是如何结束调用服务以获取警告而不是异常的呢?我收到的消息是没有一个策略替代方案可以满足(我的 pom.xml 中已经有 cxf-rt-frontend-jaxws 依赖项)
    • @ronnyfm 警告是当我做 not include cxf-rt-frontend-jaxws,所以这就是我现在要做的。
    • @FrancisAvila 谢谢,我现在收到该警告,但是我拥有所有 CXF 依赖项。但我希望我能让这项服务发挥作用。
    • @ronnyfm 我的服务与警告一起工作,因此显然我正在使用的服务的服务器端也没有强制执行其安全策略。
    【解决方案3】:

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

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

    我的“破解”解决方法是下载 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>
    

    【讨论】:

    • 这个article 建议升级到 Apache CXF 2.2.7 将解决 TransportBinding 的问题
    【解决方案4】:

    终于找到了正确的解决方案:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-03
      • 2020-08-15
      • 2023-03-20
      • 2014-02-09
      • 2014-05-11
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多