matsukaz's blog

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

Spring Web Services まとめ その8

WS-Securityの適用 (Chapter 7)

Spring-WSでは、作成したWebサービスに対しWS-Securityのアスペクトを追加できる。対応しているWS-Securityの領域は、以下の通り。

    • Authentication(認証)
    • Degital signatures(電子署名
    • Encryption and Decryption(暗号/復号化)

これらは全てXwsSecurityInterceptorを利用して実装されている。

XwsSecurityInterceptor

XwsSecurityInterceptorはその6で説明したEndpointInterceptorの実装クラスであり、内部の実装はSunのXML and web Services Security package(XWSS)をベースにしている。このため、XwsSecurityInterceptorを利用するためには、XWSSのセキュリティ・ポリシー・ファイルが必要となる。
セキュリティ・ポリシー・ファイルは、XwsSecurityInterceptorのBean定義時のpolicyConfigurationプロパティで指定する。また、XwsSecurityInterceptorのBean定義には、1つ以上のCallbackHandlerを指定する必要がある。このハンドラは、証明書/秘密鍵の取得や認証情報の検証などで利用される。以下は、XwsSecurityInterceptorの定義例である。

<beans>
    <bean id="wsSecurityInterceptor"
        class="org.springframework.ws.soap.security.xwss.XwsSecurityInterceptor">
        <property name="policyConfiguration" value="classpath:securityPolicy.xml"/>
        <property name="callbackHandlers">
            <list>
                <ref bean="certificateHandler"/>
                <ref bean="authenticationHandler"/>
            </list>
        </property>
    </bean>
    ...
</beans>
キーストア

多くの暗号化処理には、java.security.KeyStoreオブジェクトが利用される。
Springでキーストアを利用する場合は、KeyStoreFactoryBeanが利用できる。以下は、KeyStoreFactoryBeanの定義例である。

<bean id="keyStore" class="org.springframework.ws.soap.security.support.KeyStoreFactoryBean">
    <property name="password" value="password"/>  <!-- キーストアデータに対するチェックで利用 -->
    <property name="location" value="classpath:org/springframework/ws/soap/security/xwss/test-keystore.jks"/>
</bean>

XwsSecurityInterceptorでキーストアを利用する場合は、KeyStoreCallbackHandlerの定義が必要となる。このハンドラには、キーストアを受け取るプロパティが3種類(keyStore、trustStore、symmetricStore)用意されており、ハンドラに行わせたい暗号化処理に合わせて正しいキーストアを指定する必要がある。以下は、ハンドラの暗号化処理と利用されるキーストアの関係を表した表である。

暗号化処理 利用されるキーストア
証明書の検証(Certificate validation) keyStoreの次にtrustStoreの順
秘密鍵による復号化(Decryption based on private key) keyStore
対称鍵による復号化(Decryption based on symmetric key) symmetricStore
公開鍵証明書による暗号化(Encryption based on public key certificate) trustStore
対称鍵による暗号化(Encryption based on symmetric key) symmetricStore
署名(Signing) keyStore
電子署名の検証(Signature verification) trustStore

以下は、渡された証明書または電子署名を検証するためにtrustStoreを指定した例である。

<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:truststore.jks"/>
        <property name="password" value="changeit"/>
    </bean>
</beans>

また以下は、渡された電子署名の復号化や返信メッセージの署名を行うためにkeyStoreを指定した例である。

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