matsukaz's blog

Agile, node.js, ruby, AWS, cocos2d-xなどなどいろいろやってます

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>