Spring Web Services まとめ その10
Digital Signatures(電子署名)(Chapter 7)
WS-Securityの電子署名には、電子署名の検証とメッセージの署名という二つの役割がある。
電子署名の検証
証明書による認証と同様に、電子署名されたメッセージはSOAPメッセージに含められるBinarySecurityToken要素を利用する。またこの要素には、メッセージのどの部分に対する署名かを表すSignedInfo要素も含められる。
全てのSOAPメッセージがBinarySecurityToken要素を含んでいることを保証するためには、セキュリティ・ポリシー・ファイルはRequireSignature要素を記述する必要がある。また、メッセージのうち署名された部分を表すためのSignatureTarget要素を記述することもできる。指定可能な子要素は、ここで参照することができる。
<xwss:SecurityConfiguration xmlns:xwss="http://java.sun.com/xml/ns/xwss/config"> <xwss:RequireSignature requireTimestamp="false"/> </xwss:SecurityConfiguration>
上記設定後にSOAPメッセージにBinarySecurityToken要素が渡されなかった場合は、XwsSecurityInterceptorがSOAPフォルトを送信元に返す。もしも渡されていた場合には、SignatureVerificationKeyCallbackを実行し、登録したハンドラが呼ばれる。Spring-WSでは、登録可能なハンドラはKeyStoreCallbackHandlerのみである。
以下は、KeyStoreCallbackHandlerの設定例である。
<beans> <bean id="keyStoreHandler" class="org.springframework.ws.soap.security.xwss.callback.KeyStoreCallbackHandler"> <property name="trustStore" ref="trustStore"/> </bean> <bean id="trustStore" class="org.springframework.ws.soap.security.support.KeyStoreFactoryBean"> <property name="location" value="classpath:org/springframework/ws/soap/security/xwss/test-truststore.jks"/> <property name="password" value="changeit"/> </bean> </beans>
メッセージの署名
電子署名を行った場合は、XwsSecurityInterceptorがSignedInfo要素を含むBinarySecurityToken要素をメッセージに追加する。
全ての出力メッセージに署名するためには、セキュリティ・ポリシー・ファイルはSign要素を定義する必要がある。
<xwss:SecurityConfiguration xmlns:xwss="http://java.sun.com/xml/ns/xwss/config"> <xwss:Sign includeTimestamp="false" /> </xwss:SecurityConfiguration>
XwsSecurityInterceptorは、SignatureKeyCallbackを実行し、登録したハンドラを呼び出す。Spring-WSdeha、登録可能はハンドラはKeyStoreCallbackHandlerのみである。
以下は、KeyStoreCallbackHandlerの設定例である。
<beans> <bean id="keyStoreHandler" class="org.springframework.ws.soap.security.xwss.callback.KeyStoreCallbackHandler"> <property name="keyStore" ref="keyStore"/> <property name="privateKeyPassword" value="changeit"/> </bean> <bean id="keyStore" class="org.springframework.ws.soap.security.support.KeyStoreFactoryBean"> <property name="location" value="classpath:keystore.jks"/> <property name="password" value="changeit"/> </bean> </beans>