Подтвердить что ты не робот

WSP0075: Утверждение политики "TransportBinding" оценивалось как "UNKNOWN". Зачем?

Я клиент для SOAP-службы, которой я не управляю (реализован в .NET). Служба предоставляет WSDL. Я использую Apache CXF для создания java-клиента из WSDL (в частности, я использую cxf-codegen-plugin для Maven, который использует 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 использует некоторые неявные заголовки мыла в своих аргументах, и мне это нужно, поэтому они правильно включены в создаваемые методы класса сервиса.

Я добавил зависимостей 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>
4b9b3361

Ответ 1

Через догадки и глядя на артефакты в центральном центре 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)
    ...

Это, скорее всего, по той причине, что ответ Вилли Уилер указал: для политики требуется 256-битное шифрование на транспорте, но эта служба SSL использует 128-битное шифрование. Однако использование wsdl с Base128 вместо этого не устраняет это исключение, и я еще не исследовал.

Таким образом, вполне возможно, что все, кто использует эту услугу, вероятно, получают это предупреждение или что-то в этом роде, и невозможно использовать эту службу, если политика безопасности действительно проверена. Наверное, я буду жить с предупреждением.

Ответ 2

Я могу воспроизвести эту проблему с помощью службы ярлыков 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-битным шифрованием.

См. http://specs.xmlsoap.org/ws/2005/07/securitypolicy/ws-securitypolicy.pdf, разделы 7.1, 8.1 и 8.3 для получения информации о политиках TransportBinding и наборах алгоритмов. Я считаю, что предупреждение говорит о том, что для политики требуется 256-битное шифрование, но поскольку служба не поддерживает его, клиент выбирает вместо этого более слабый алгоритм шифрования.

Поскольку это проблема со стороны службы, возможно, лучший способ ее исправить - это сообщить стороне, ответственной за обслуживание проблемы.

Ответ 3

Я обнаружил, что эти ошибки регистрируются до того, как запрос SOAP даже отправлен.

Предупреждения не появлялись в Java 6. Они появляются в Java 7 и Java 8. Я подозреваю, что эти предупреждения связаны с устаревшим jaxrpc.jar в моем исходном коде.

Мой "хакерский" рабочий процесс состоял в том, чтобы загрузить копию файла WSDL и изменить раздел политики. Затем укажите основной класс в моей веб-службе на этот модифицированный файл 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>