2017-12-21 5 views
0

wssecurity에 대한 올바른 이해를 아직 확신 할 수 없지만 필요한 순서대로 수정하십시오. 문제점을 설명합니다. 내가 CXF 프레임 워크ws-security/wss4j 호출 방법 weblogic 12c

주로하기 때문에 이러한 종속성의 보안 웹 서비스와 통신하는 독립 CXF 클라이언트를 만드는 succeded

<wsp:Policy wsu:Id="AsymmetricX509TokensWithUntPolicy"> 
    <wsp:ExactlyOne> 
     <wsp:All> 
      <sp:SupportingTokens xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"> 
       <wsp:Policy> 
        <sp:UsernameToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient"> 
         <wsp:Policy> 
          <sp:WssUsernameToken10/> 
         </wsp:Policy> 
        </sp:UsernameToken> 
       </wsp:Policy> 
      </sp:SupportingTokens> 
      <sp:AsymmetricBinding> 
       <wsp:Policy> 
        <sp:InitiatorToken> 
         <wsp:Policy> 
          <sp:X509Token sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient"> 
           <wsp:Policy> 
            <sp:WssX509V3Token10/> 
           </wsp:Policy> 
          </sp:X509Token> 
         </wsp:Policy> 
        </sp:InitiatorToken> 
        <sp:AlgorithmSuite> 
         <wsp:Policy> 
          <sp:Basic128/> 
         </wsp:Policy> 
        </sp:AlgorithmSuite> 
        <sp:Layout> 
         <wsp:Policy> 
          <sp:Lax/> 
         </wsp:Policy> 
        </sp:Layout> 
        <sp:IncludeTimestamp/> 
        <sp:ProtectTokens/> 
        <sp:OnlySignEntireHeadersAndBody/> 
       </wsp:Policy> 
      </sp:AsymmetricBinding> 
      <sp:SignedParts> 
       <sp:Body/> 
       <sp:Header Name="Timestamp" Namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"/> 
      </sp:SignedParts> 
      <sp:Wss11> 
       <wsp:Policy> 
        <sp:MustSupportRefKeyIdentifier/> 
       </wsp:Policy> 
      </sp:Wss11> 
     </wsp:All> 
    </wsp:ExactlyOne> 
</wsp:Policy> 

:

나는 정책을 사용 WSDL에서 잭스 - WS 클라이언트를 구현하기 위해 노력하고는 정책이 보인다

<dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-ws-security</artifactId> 
     <version>3.2.1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-ws-policy</artifactId> 
     <version>3.2.1</version> 
    </dependency> 

이러한 것들은 헤더를 제공하고 내가 이해하지 못하는 많은 것들을 자동으로 처리하지만 작동합니다. 클라이언트에 대한 내 설정은 simpel입니다 :

 Map ctx = ((BindingProvider) webServicePortType).getRequestContext(); 

    ClassLoader loader = Thread.currentThread().getContextClassLoader(); 
    Properties props = new Properties(); 
    try (InputStream resourceStream = loader.getResourceAsStream(signaturePropertyFilePath)) { 
     props.load(resourceStream); 
    } catch (IOException e) { 
     throw new RuntimeException(
       "IOException: Unresolvable signature property filepath: " + signaturePropertyFilePath, e); 
    } 
    props.forEach((k, v) -> { 
     ctx.put(k.toString(), v); 
    }); 
    ctx.put(SecurityConstants.CALLBACK_HANDLER, callBackHandler); 

    ctx.put(SecurityConstants.SIGNATURE_PROPERTIES, signaturePropertyFilePath); 

이제 내 문제, 나는 그것이 작동 본, 그래서 나는 행복하게 웹 로직 12C에서 실행되는 웹 어플리케이션 내 클라이언트를 이동,하지만 지금은 일이 잘못 간다. CXF-RT-WS-policy의 좋은 자동 성격은 이제 사라지고 난 오류가 발생 헤더없이 비누 요청을 얻을 :

These policy alternatives can not be satisfied: 

{http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702} UsernameToken이 : 수신 토큰이 토큰 포함 요구 사항과 일치하지 않는 {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702가 } AsymmetricBinding : 수신 요구 사항과 일치하지 않습니다 타임 스탬프 {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702} InitiatorToken {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702} X509Token의 : 수신 토큰이 토큰 포함 요구 사항과 일치하지 않는 {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702} IncludeTimestamp {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702} ProtectTokens {(210)} {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702} SignedParts을 OnlySignEntireHeadersAndBody : {http://www.w3.org/2003/05/soap-envelope} 바디

, 헤더의 결과

에 서명하지.

운 좋게도 weblogics에서 cxf 클라이언트를 일반적으로 실행하는 데 문제가 없습니다. 웹 서비스에는 보안 요구 사항이 없습니다. 독립 실행 형 클라이언트에 스프링 또는 스프링 부트 스트랩이 포함되어 있지 않습니다. 아마도 cxf 자체가 스프링을 호출하지만 도움이되지 않습니다.

cxf 프레임 워크에서 가져온 "PolicyInterceptorProviderRegistryImpl"은 weblogic에서 실행할 때 작동을 멈 춥니 다. 컨테이너에서 실행할 때 다르게 작동하는 cxf bus-extensions.txt와 관련이 있다고 판단됩니다. weblogic의 webapplication에서는 Spring을 사용할 수 없습니다. 죄송합니다. 그러나 내 독립형 제품은 봄철없이 잘 작동합니다. 누구나 cxf 프레임 워크에서 도와주세요! :)

그렇다면 독립 실행 형이며 컨테이너에서 실행되는 이유는 무엇입니까? 누구든지 도와 줄 수 있습니까? 사전 :

답변

0

에서

덕분에 나는 다른 해결책을 찾을 수 있었다. 내 독립형에서 작동하는 ws-security 헤더의 멋진 자동 삽입 동작은 weblogic 12와 함께 작동하지 못했습니다. 대신 수동으로 구성하고 weblogic에서 자체 Moxy impl이 아닌 JAXBContextFactory의 다른 구현을 사용해야했습니다. cxf가 moxy와의 호환성을 주장 했음에도 불구하고 moxy에 문제가있었습니다.

  1. 클래스 경로 파일의 META-INF/서비스/javax.xml.bind.JAXBContext는
  2. 텍스트 "com.sun.xml.bind.v2 추가 다음 만듭니다.

    Client client = ClientProxy.getClient(webServicePortType); 
    
    Map<String, Object> outProps = new HashMap<String, Object>(); 
    
    outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN + " " 
         + WSHandlerConstants.TIMESTAMP + " " + WSHandlerConstants.SIGNATURE); 
    outProps.put(WSHandlerConstants.USER, user); 
    outProps.put(WSHandlerConstants.PW_CALLBACK_REF, callBackHandler); 
    outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT); 
    outProps.put(WSHandlerConstants.SIG_PROP_FILE, signaturePropertyFilePath); 
    outProps.put(WSHandlerConstants.SIG_KEY_ID, "DirectReference"); 
    outProps.put(WSHandlerConstants.SIGNATURE_PARTS, 
         "{Element}{http://schemas.xmlsoap.org/soap/envelope/}Body;{Element}{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd}Timestamp"); 
    
    client.getOutInterceptors().add(new WSS4JStaxOutInterceptor(outProps)); 
    
  3. :

    security.username=151413 
    security.password=NA 
    security.signature.username=sisprivatekey 
    org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin 
    org.apache.ws.security.crypto.merlin.keystore.type=jks 
    org.apache.ws.security.crypto.merlin.keystore.password=changeit 
    org.apache.ws.security.crypto.merlin.keystore.private.password=changeit 
    org.apache.ws.security.crypto.merlin.keystore.file=KeyStore.jks 
    
  4. CallbackHandler cpc = new CallbackHandler() { 
    
        @Override 
        public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { 
    
         for (int i = 0; i < callbacks.length; i++) { 
    
          WSPasswordCallback pc = (WSPasswordCallback) callbacks[i]; 
    
          if (pc.getUsage() == WSPasswordCallback.SIGNATURE 
            || pc.getUsage() == WSPasswordCallback.DECRYPT) { 
    
    
            pc.setPassword("changeit"); 
          } else { 
           pc.setPassword("NA"); 
          } 
         } 
        } 
    
    }; 
    
  5. 설정 WSS4J/WS-보안 수동으로 해 CallbackHandler를 만듭니다 ContextFactory는 "

  6. 이 서명 속성 파일을 만듭니다 파일로

  7. 완료.

관련 문제