私はSOAP制御しないサービス(.NETで実装)のクライアントです。このサービスはWSDLを提供します。ApacheCXFを使用してJavaを生成します= WSDLからのクライアント(具体的には、内部でwsdl2Javaを使用するMavenのcxf-codegen-pluginを使用しています)。
ただし、生成されたサービスクラスをインスタンス化すると、次の警告がログに記録されます。
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ヘッダーを使用するためです。生成されたサービスクラスメソッドに適切に含まれるように、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>
当て推量と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)
...
これは、ウィリーウィーラーの回答が指摘した理由が最も考えられます。ポリシーではトランスポートで256ビットの暗号化が必要ですが、このサービスのSSLは128ビットの暗号化を使用しています。ただし、代わりにBase128
でwsdlを使用しても、この例外は解決されず、さらに調査しませんでした。
したがって、このサービスを使用するすべての人がおそらくこの警告またはそれに類するものを受け取る可能性があり、セキュリティポリシーが実際にチェックされている場合、このサービスを使用することは不可能です。私は代わりに警告とともに生きていると思います。
この問題は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証明書を見ると、128ビット暗号化であるAES_128_CBCが使用されています。
TransportBindingポリシーとアルゴリズムスイートの詳細については、 http://specs.xmlsoap.org/ws/2005/07/securitypolicy/ws-securitypolicy.pdf 、セクション7.1、8.1、および8.3を参照してください。この警告では、このポリシーでは256ビットの暗号化が必要であると述べていますが、サービスは256ビットの暗号化をサポートしていないため、クライアントは代わりに弱い暗号化アルゴリズムを選択しています。
これはサービス側の問題であるため、おそらくサービスの責任者に問題を通知することが最善の方法です。
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>