2011-07-15 17 views
6

Biri web hizmetini ve diğer ws istemcisini temsil eden 2 web uygulaması dağıttım. SIGNING ve TIMESTAMP-ing kullanırken, her şey iyi çalışıyor, istemci pulları mesajı (ama varsayılan 300s ttl'yi geçersiz kılmadığını düşünüyorum), mesajı x509 sertifikayla imzalar ve ws'ye gönderir. Öte yandan, mesaj verir ve müşterinin anahtar deposundaki güvenilir sertifikasına karşı zaman damgasını ve sertifika/imzayı doğrulayabilir.İlkbaharda (wss4j) şifreleme/şifre çözme eklemenin doğru yolu nedir?

Yapılandırmam için Şifreleme işlemini eklediğimde sorun çıkıyor. İstemci mesajı şifreleyebiliyor gibi görünüyor, ancak mesajın şifresini çözmede ws gibi gözükmüyor. O sadece

 
[SaajSoapMessage {http://www.w3.org/2001/04/xmlenc#}EncryptedData] 

için bir bitiş noktası eşleme olduğunu görür ve

 
WebServiceTransportException: Not Found [404] exception. 

SO birisi ben x509 ile yine x509 ve şifreleme ile imzalanması, Timestamping ulaşmak için yapmanız gereken açıklayabilir atar ?

sunucu app-bağlamın parçası:

<bean id="wss4jSecurityInterceptor" class="org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor"> 
     <!-- valiadation --> 
     <property name="validationActions" value="Timestamp Signature Encrypt"/> 
     <property name="enableSignatureConfirmation" value="true"/> 
     <property name="validationSignatureCrypto"> 
      <ref bean="keystore"/> 
     </property> 
     <property name="validationDecryptionCrypto"> 
       <ref bean="keystore"/> 
     </property> 
     <property name="validationCallbackHandler"> 
      <bean class="org.springframework.ws.soap.security.wss4j.callback.KeyStoreCallbackHandler"> 
       <property name="privateKeyPassword" value="password"/> 
      </bean> 
     </property> 
     <!-- timestamp options --> 
     <property name="timestampStrict" value="true"/> 
     <property name="timeToLive" value="30"/> 
     <property name="timestampPrecisionInMilliseconds" value="true"/> 
     <!-- signing and encryption --> 
     <property name="securementActions" value="Timestamp Signature Encrypt"/> 
     <property name="securementUsername" value="wsserver"/> 
     <property name="securementPassword" value="password"/> 
     <property name="securementSignatureKeyIdentifier" value="DirectReference"/> 

     <property name="securementSignatureCrypto"> 
      <ref bean="keystore"/> 
     </property> 
     <property name="securementEncryptionUser" value="wsclient"/> 
     <property name="securementEncryptionCrypto"> 
      <ref bean="keystore"/> 
     </property> 
</bean> 
<!-- keystore --> 
<bean id="keystore" class="org.springframework.ws.soap.security.wss4j.support.CryptoFactoryBean"> 
      <property name="keyStorePassword" value="password"/> 
      <property name="keyStoreLocation" value="WEB-INF/MyTruststore.jks"/> 
</bean> 
<!-- interceptors --> 
<sws:interceptors> 
<ref bean="wss4jSecurityInterceptor"/> 
<bean id="validatingInterceptor" 
class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor"> 
    <property name="schema" value="/WEB-INF/person.xsd"/> 
    <property name="validateRequest" value="true"/> 
    <property name="validateResponse" value="true"/> 
</bean> 
    <bean id ="loggingInterceptor" class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor"> 
    </bean> 
    </sws:interceptors> 

Müşteri temel olarak, o şifreleme için sunucu genel anahtarı kullanır haricinde, aynı yapılandırma kullanır ve şifre çözme için yaptığı özel anahtar. İmza Tamam çalıştığı için

anahtar depolarını, sanırım, Tamam ... ben Şifrele eylemi eklediğinizde yıkılır juust Her şey sunucusu günlüğünün parçası diyor ki:

 
DEBUG [org.springframework.ws.server.MessageTracing.recei ved] - Received request [SaajSoapMessage {http://www.w3.org/2001/04/xmlenc#}EncryptedData] 
DEBUG [org.springframework.ws.server.endpoint.mapping.Pay loadRootAnnotationMethodEndpointMapping] - Looking up endpoint for [{http://www.w3.org/2001/04/xmlenc#}EncryptedData] 
DEBUG [org.springframework.ws.soap.server.SoapMessageDisp atcher] - Endpoint mapping [org.springframework.ws.server.endpoint.mapping.Pay [email protected]] has no mapping for request 
... 
No endpoint mapping found for [SaajSoapMessage {http://www.w3.org/2001/04/xmlenc#}EncryptedData] 
org.springframework.ws.client.WebServiceTransportE xception: Not Found [404] 
... 

Ben bir şekilde çözmek için ws talimat gerektiğini düşünüyorum SOAP gövdesi daha önce mesaj için bir son nokta aramaya başlar, fakat nasıl olduğunu bilmiyorum. Öneriler?

+1

için yapılan soruna neden oldu, iyi, kinda. Buradaki şey, @PayloadRoot ek açıklamasını kullanmamdı, ancak benim payloadRoot, hiçbir zaman uygulamamın bir uç noktaya eşlenebileceği bir şey değildi .. sadece EncryptedData idi. Ann'i @ SoapAction olarak değiştirdim ve WebServiceMessageCallback() arabirimini istemcinin marshalSendAndReceive() öğesine eklediğimde, web hizmeti EncryptedData veri yükü için eşleme olmadığını düşündü, bu yüzden SoapActionAnnotationMethodEndpointMapping ile eşleşme aradı ve bir tane buldu. Sunucu, yalnızca istek için eşleme bulduğunda, SOAP gövdesinin şifresini çözdü ve PayloadRoot'un orada bulunduğunu öğrendim :) – mare

+0

Lütfen soruyu kapatın! –

+0

Sunucu uygulama bağlamında, şifre çözme ve imza için anahtar diğer adı nerede belirliyorsunuz? – WarLord

cevap

6

Yorumlarınız yardımcı oldu, ancak bir tür eksiklikten ötürü, biraz daha fazla ayrıntıyla yanıt vermenin bir çekimini çektim. Yay öğretici

, uç nokta yöntemi @PayloadRoot ile açıklamalı: sabun mesajı şifrelenmez Bu iyi çalışır @PayloadRoot(localPart = "orderInput", namespace = "http://samples")

. PayloadRootAnnotationMethodEndpointMapping, ilgili mesaja sabun mesajıyla eşleştirebilir.

Sabun iletisi şifrelendiğinde, PayloadRootAnnotationMethodEndpointMapping sabun iletisini eşleyemiyor çünkü güvenlik engelleyicisi bunu çözme zamanına sahip değildi. Çözüm @PayloadRoot'un @SoapAction ile değiştirilmesidir.

Bir soap mesajı alındığında, spring-ws önce PayloadRootAnnotationMethodEndpointMapping öğesini ve SoapActionAnnotationMethodEndpointMapping öğesini çağırır. Sen olmayan yay istemci (eksen örneğin veya .net) ile uyumlu tam olması için de kullanabilirsiniz:

@PayloadRoot(localPart = "orderInput", namespace = "http://samples") 
@SoapAction("http://samples/order") 

Son olarak: Eğer güvenli sabun mesajı içeren bir yay istemcisi kullanıyorsanız, bahar yapar sabun eylemini otomatik olarak göndermeyin. Sunucunuz sabun mesajını uygun eylemle eşleyemez.

ClientMessageCallBack callBack = new ClientMessageCallBack(
"http://samples/order");      
Object output = wsTemplate.marshalSendAndReceive(inputObject, callBack); 

ClientMessageCallBack sınıfı securementEncryptionParts özelliği tanımlı olmadığı için bu durum

public final class ClientMessageCallBack 
    implements WebServiceMessageCallback { 

    /**the soapAction to be appended to the soap message.*/ 
    private String soapAction; 

    /**constructor. 
    * @param action the soapAction to be set.*/ 
    public ClientMessageCallBack(final String action) { 
     this.soapAction = action; 
    } 

    @Override 
    public void doWithMessage(final WebServiceMessage message) 
      throws IOException, TransformerException { 

     if (message instanceof SoapMessage) { 
      SoapMessage soapMessage = (SoapMessage) message; 
      soapMessage.setSoapAction(soapAction); 
     } 

    } 
} 
+0

thx alot! ClientMessageCallBack'in yerine, .marshalSendAndReceive (istek, yeni SoapActionCallback ("http://spring.io/guides/gs-producing-web-service")); – Janiiik

0

geçerli: Bu sorunu çözmek için, bir WebServiceMessageCallback kullanmalıdır. Bu, tüm vücudu şifrelemek ve bu Hata