2016-12-07 18 views
0

昨日から、ws-securityを使用してWebサービスのSOAP(apache cxf)にセキュリティを統合しようとしています。このために私は次のような構成があります。 --my endppointをし、そのインターセプタ構成:ws-securityを使用した認証SOAPリクエストの例外

@Configuration 
@ImportResource({"classpath:META-INF/cxf/cxf.xml"}) 
@ComponentScan(basePackages ={"com.nhit.dev"}) 
public class MyConfig extends SpringBootServletInitializer{ 



@Bean 
public IServicesWeb momoService() { 
    return new MomoServices(); 
} 

@Bean(name = Bus.DEFAULT_BUS_ID) 
public SpringBus springBus() { 
    return new SpringBus(); 
} 


@Bean 
public ServletRegistrationBean cxfServlet() { 
    ServletRegistrationBean servlet = new ServletRegistrationBean(new CXFServlet(), "/services/*"); 
    servlet.setLoadOnStartup(1); 
    return servlet; 
} 

@Bean 
public Endpoint endpoint() { 

EndpointImpl endpoint = new EndpointImpl(springBus(), momoService()); 
endpoint.publish("/momo"); 
Map<String, Object> inProps = new HashMap<String, Object>(); 
inProps.put("action", "UsernameToken"); 
inProps.put("passwordType", "PasswordText"); 
inProps.put("passwordCallbackClass", "com.nhit.dev.mobilepayment.web.WsPwdCallBack"); 
endpoint.getInInterceptors().add(new WSS4JInInterceptor(inProps)); 

     Map<String, Object> outProps = new HashMap<String, Object>(); 
    outProps.put("action", "UsernameToken"); 
    outProps.put("user", "abc"); 
    outProps.put("passwordType", "PasswordText"); 
    outProps.put("passwordCallbackClass", "com.nhit.dev.mobilepayment.web.WsPwdCallBack"); 
    endpoint.getOutInterceptors().add(new WSS4JOutInterceptor(outProps)); 
    return endpoint; 
} 

}

--my PasswordCallbackのクラスハンドラ:

public class WsPwdCallBack implements CallbackHandler{ 

protected final Log logger = LogFactory.getLog(getClass()); 

private Map<String, String> passwords = new HashMap<String, String>(); 

public WsPwdCallBack() { 
    passwords.put("abc", "abc"); 
    passwords.put("xyz", "xyz"); 
} 

public void handle(Callback[] callbacks) throws IOException, 
     UnsupportedCallbackException { 
    for (int i = 0; i < callbacks.length; i++) { 
     WSPasswordCallback pc = (WSPasswordCallback) callbacks[i]; 

     String pass = passwords.get(pc.getIdentifier()); 
     if (pass != null) { 
      pc.setPassword(pass); 
      return; 
     } 
    } 
} 

}

- -finally soapUIからの私の石鹸リクエスト:

SOAPUIから

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservices.web.mobilepayment.dev.nhit.com/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
 
    <soapenv:Header> 
 
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" soapenv:mustUnderstand="1"> 
 
     <wsse:UsernameToken wsu:Id="UsernameToken-87b7b0c5-31fe-4a01-b333-f9ca564ded57"> 
 
      <wsse:Username>xyz</wsse:Username> 
 
      <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">TlPGdyb/NOoeA2KMO0n6DbmA0AA=</wsse:Password> 
 
      <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">FCG+tTtuZXguO8nUQUQeIQ==</wsse:Nonce> 
 
      <wsu:Created>2016-12-08T12:12:00.Z</wsu:Created> 
 
     </wsse:UsernameToken> 
 
     </wsse:Security> 
 
    </soapenv:Header> 
 
    <soapenv:Body> 
 
     <web:creerDevise> 
 
     <!--Optional:--> 
 
     <libelle>Livre</libelle> 
 
     </web:creerDevise> 
 
    </soapenv:Body> 
 
</soapenv:Envelope>

私はこの要求を実行すると、私は次のエラー受け取る:だから

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
 
    <soap:Body> 
 
     <soap:Fault> 
 
     <faultcode xmlns:ns1="http://ws.apache.org/wss4j">ns1:SecurityError</faultcode> 
 
     <faultstring>A security error was encountered when verifying the message</faultstring> 
 
     </soap:Fault> 
 
    </soap:Body> 
 
</soap:Envelope>

を、私は私wildflyログを見に行きますよ私のアプリの.earアーカイブを配備しました。そしてそこに、私はこの例外を見た:

Caused by: org.apache.wss4j.common.ext.WSSecurityException: The message has expired

私はWS-Securityのに非常に新しいです、それを修正するために私を助けてください。私はこの例外を解決する方法を知りません。

+0

サーバとクライアントは同じマシンにありますか?クロックは同期していますか? – pedrofb

+0

@pedrofbはい、サーバーとクライアントは同じマシンです。サーバはWildfly、ローカルホストにインストールされ、クライアントはSoapUIが同じマシンにインストールされています – FiokoSoft

答えて

1

WSS4Jは、UsernameTokenのCreationタイムスタンプにデフォルトで5分の時間制限を適用します。 SOAP UIでは、最後に作成してから5分以上経過している場合は、UsernameTokenスニペットを再作成する必要があります。また、有効期限の制限時間を長くするようにWSS4Jを構成することもできます。

+0

ありがとう@Colm、どうすればこのようなwss4jを設定できますか? – FiokoSoft

+0

@Colmありがとう、どうすればwss4jをこのように設定できますか?そして、5分の時間制限はどの時間間隔に対応していますか?なぜなら、手作業で創造の日時(要素:)を書くからです。私はこの技術では非常に新しいです、可能であれば、あなたがもっと深く私に説明することができますか? – FiokoSoft

+1

なぜ有効期限を無効にしたいのですか?実際にする必要がある場合は、プロパティ "utTimeToLive"を何らかの大きな値に設定することができます(デフォルトは "300"(秒単位の時間))。 5分は、受信者がメッセージの期限が切れたと判断したUsernameTokenの作成時刻の後の時刻です。 –

関連する問題