2014-09-04 14 views
12

저는 제어 할 수없는 SOAP 서비스의 클라이언트입니다 (.NET에서 구현 됨). 이 서비스는 WSDL을 제공합니다. 나는 아파치 CXF를 사용하여 WSDL에서 자바 클라이언트를 생성한다 (특히, 후드 아래에서 wsdl2java를 사용하는 Maven 용 cxf-codegen-plugin을 사용하고있다). 내가 생성 된 서비스 클래스를 인스턴스화 할 때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". 

- 내가 서비스를 사용하는 문제가 없습니다. 그러나 나는이 오류에 당혹 스럽다. 그러나 지금까지의 내가이 말할 수있는

<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> 

그것에 대해 특별한 아무것도 완벽하게 일반 정책 :

오류 나는 그것을 이해할 수 없다고 생각하는 WSDL이 보안 정책에 관한 것입니다. 확실하게 이해해야합니까? 이 경고는 어떻게 수정합니까?

레코드의 경우 wsdl2java가 호출되는 방법은 다음과 같습니다 (pom.xml에서 발췌).

-exsh true arg 및 cxf-rt-bindings-soap 종속성은 WSDL이 인수에 암시 적 비누 헤더를 사용하고 생성 된 서비스 클래스 메소드에 올바르게 포함되도록하기 위해 필요합니다.

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> 
내가 익스프레스-1 레이블 서비스와 함께이 문제를 재현 할 수

답변

8

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 대신 사용하면이 예외가 해결되지 않으며 더 이상 조사하지 않았습니다.

이 서비스를 사용하는 모든 사람이이 경고 또는 비슷한 것을 얻게 될 가능성이 있으며 보안 정책이 실제로 확인되면이 서비스를 사용할 수 없습니다. 나는 내가 경고와 함께 살 것이라고 생각한다.

+0

잘 알고 있습니다. 공동 조사에 감사드립니다. –

+0

그래서 예외 대신 경고를 받으려면 어떻게 서비스를 종료 했습니까? 나는 어떤 정책 대안도 만족시킬 수 없다는 메시지를 얻고있다. (나는 이미 px.xml에 cxf-rt-frontend-jaxws 종속성을 가지고있다.) – ronnyfm

+0

@ronnyfm 경고는 내가하지 않았을 때 _not_ cxf-rt-frontend-jaxws , 그래서 그것은 지금 내가하는 일입니다. –

5

:

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는 무엇입니까? alg 스위트 정책으로 사용해보십시오. alg 약어에 대해 게시 한 사양의 섹션 7.1을 참조하십시오. –

+0

당신이 뭔가있는 것 같아요. 제 끝점에도 SSL에 128 비트 암호화가 있습니다. 그러나 WSDL을 오버라이드 할 때'Basic128'을 사용하거나'AlgorithmSuite'를 제거하면 아무것도 변하지 않습니다. 전체 'TransportBinding' 섹션을 제거해야만 경고가 사라집니다. 또한 이것이 문제인 경우 UNKNOWN이 아니라 UNSUPPORTED를 기대합니다. 어떻게 든 정책 평가자가 전송에 대해 모를 수 있으므로 * 'TransportBinding' 섹션이 'UNKNOWN'경고를 발생시킬 수 있습니까? 이것은 다시 런타임 종속성을 놓치고 있다고 생각하게 만듭니다. –

+0

어떤 암호화 암호를 사용하고 있습니까? (비트 길이뿐만 아니라, alg.) AES 또는 다른 것입니까? –

1

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> 
+0

이 [article] (http://www.ibm.com/developerworks/library/j-jws13/)에서는 Apache CXF 2.2.7로 업그레이드하면 TransportBinding –