2014-09-04 96 views
12

我是我不控制的SOAP服務的客戶端(在.NET中實現)。該服務提供了一個WSDL。我使用Apache CXF從WSDL生成java客戶端(具體來說,我使用的是Maven的cxf-codegen插件,它使用了wsdl2java)。WSP0075:策略斷言「TransportBinding」被評估爲「UNKNOWN」。爲什麼?

然而,當我實例生成的服務類,下面的警告記錄:

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> 

回答

8

通過猜測並查看maven central中的工件,我能夠找到解決方案。

事實證明,爲了真正理解和評估此wsdl中的策略,必須提供缺少的運行時依賴關係。對我來說這是org.apache.cxf/cxf-rt-frontend-jaxws。我無法在任何地方找到這個文件。這牽扯到一些其他的cxf依賴關係,我不知道是否有更多的最小集合是可以的。

一旦我包含這個依賴關係,當我實例化客戶端對象時,我不再收到警告。 (另外,實例化需要更長的時間!)

然而,當我嘗試使用這項服務,我得到異常:

​​

這是最有可能的是威利惠勒的回答指出了原因:政策傳輸上需要256位加密,但此服務的SSL使用128位加密。但是,與Base128一起使用wsdl並不能解決此異常,因此我沒有進一步調查。

所以使用這個服務的每個人都可能會得到這個警告或類似的東西,而且如果實際檢查安全策略,就不可能使用這個服務。我想我會改變生活的警告。

+0

很高興知道。感謝聯合調查。 – 2014-09-12 04:30:41

+0

那麼,你是如何結束調用服務才能獲得警告而不是異常的?我得到的消息是沒有任何可以滿足的策略選項(我的pom.xml中已經有cxf-rt-frontend-jaxws依賴項) – ronnyfm 2016-08-10 15:12:01

+0

@ronnyfm警告是當我做了_not_包括cxf-rt-frontend-jaxws ,所以這就是我現在所做的。 – 2016-08-11 07:51:05

5

我可以重現這個問題與快遞-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位加密,但由於該服務不支持它,因此客戶端正在選擇較弱的加密算法。

由於這是服務方面的問題,可能最好的解決方法是通知負責該問題服務的一方。

+0

嗯。您可以嘗試自簽名256位證書並查看會發生什麼。或者確保您使用的128位加密屬於「基本」分類。什麼是你使用的特定128位加密算法?嘗試使用它作爲alg套件策略。請參閱我發佈的規範的第7.1節以瞭解alg縮寫。 – 2014-09-11 19:22:19

+0

我認爲你正在做的事 - 我的端點在其SSL上也有128位加密。但是,當我重寫WSDL以使用'Basic128'或刪除'AlgorithmSuite'時,沒有任何更改。只有當我移除整個'TransportBinding'部分時,警告纔會消失。 此外,如果這是問題,我會期望'UNSUPPORTED',而不是'UNKNOWN'。難道是政策評估人員不知道有關運輸的情況嗎?所以*任何* 'TransportBinding'部分會導致'UNKNOWN'警告?這再次讓我覺得我錯過了一些運行時依賴。 – 2014-09-11 20:28:54

+0

你正在使用哪種加密算法? (不僅僅是位長度,還有alg。)它是AES還是別的? – 2014-09-11 20:53:48

1

我發現在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> 
+0

這篇文章(http://www.ibm.com/developerworks/library/j-jws13/)建議升級到Apache CXF 2.2.7將解決TransportBinding問題 – 2015-02-09 23:41:01

相關問題