2011-07-15 10 views
6

私は2つのWebアプリケーションを展開しています.1つはWebサービスを表し、もう1つはwsクライアントです。 SIGNINGとTIMESTAMPを使用すると、すべて正常に動作し、クライアントのスタンプメッセージ(私は彼がデフォルトの300秒のttlをオーバーライドしないと思います)、x509証明書でメッセージに署名してwsに送信します。一方、彼はメッセージを受け取り、自分のキーストア内のクライアントの信頼できる証明書に対するタイムスタンプと証明書/署名を評価することができます。spring-ws(wss4j)で暗号化/復号化を追加する適切な方法は何ですか?

私の設定に暗号化操作を追加すると問題が発生します。クライアントはメッセージを暗号化できるように見えますが、メッセージを復号化する際には意識されていないようです。彼はちょうどSO誰かがX509で再び、X509および暗号化して署名、タイムスタンプを達成するために、私は何をする必要があるかを説明することができます

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

には、エンドポイントのマッピングが存在しないことを認識し、

 
WebServiceTransportException: Not Found [404] exception. 

をスローします?

サーバーアプリケーションコンテキストの一部:

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

クライアントbasiclyが、彼は暗号化のために、サーバの公開鍵を使用すること以外は、同じ設定を使用し、暗号解読のための彼の秘密鍵。署名は、[OK]を動作するため

キーストアは、私は推測、大丈夫です...私は暗号化アクションを追加するときに崩壊してしまうjuustすべては、サーバログの一部は言う:

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

私は何とか解読するためにWSを指示する必要がありだと思いますSOAPボディはメッセージのエンドポイントを探す前に開始されますが、どうすればわかりません。提案?

+1

私はこの問題を解決しました。 私は@PayloadRootアノテーションを使用していましたが、私のpayloadRootは決してアプリケーションがエンドポイントにマップできるものではありませんでした。ちょうどEncryptedDataでした。 annを@ SoapActionに変更し、WebServiceMessageCallback()インターフェイスをクライアントのmarshalSendAndReceive()に追加したとき、WebサービスはEncryptedDataペイロードのマッピングがないと考え、SoapActionAnnotationMethodEndpointMappingでマッピングを探して見つけました。 サーバが要求のためのマッピングを見つけたときだけ、SOAPボディを復号化して、PayloadRootがそこにあることを知りました:) – mare

+0

質問を閉じてください! –

+0

サーバーのアプリケーションコンテキストでは、どこで復号化と署名のためのキーエイリアスを指定していますか? – WarLord

答えて

6

あなたのコメントは役に立ちましたが不完全なものだったので、少し詳しく説明しました。スプリングチュートリアル

は、エンドポイント法は@PayloadRootで注釈される:SOAPメッセージが暗号化されていない場合@PayloadRoot(localPart = "orderInput", namespace = "http://samples")

これは正常に動作します。 PayloadRootAnnotationMethodEndpointMappingは、対応するメソッドへのSOAPメッセージにマッピングできます。

Soapメッセージが暗号化されている場合、セキュリティインターセプタにまだ復号化の時間がなかったため、PayloadRootAnnotationMethodEndpointMappingはSOAPメッセージをマップできません。解決策は、@ PayloadRootを@SoapActionに置き換えることです。

soapメッセージが受信されると、spring-wsは最初にPayloadRootAnnotationMethodEndpointMappingとSoapActionAnnotationMethodEndpointMappingを呼び出します。あなたは、非スプリングクライアント(軸例えばまたは.NET)との互換性が完全なものとするために両方を使用することができます。

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

なく、少なくとも最後に:あなたが保護されたSOAPメッセージと春のクライアントを使用している場合は、春にはありません自動的に石鹸の動作を送信しません。あなたのサーバーは適切なアクションで石鹸メッセージをマップすることができません。

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

ClientMessageCallBackクラスを使用すると、securementEncryptionPartsプロパティが定義されていなかったので、これが起こる

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の代わりに、私は.marshalSendAndReceive(リクエスト、新しいSoapActionCallback( "http://spring.io/guides/gs-producing-web-service"))を使用しました。 – Janiiik

0

次のとおりです。この問題を解決するために、あなたはWebServiceMessageCallbackを使用する必要があります。それは全身を暗号化してこのエラーを引き起こします。

関連する問題