Spring XWSS消息签名

时间:2014-02-03 11:55:22

标签: java spring web-services spring-ws ws-security

我目前正在开发一个连接第三方Web服务的客户端界面。

此第三方网络服务要求发送给他们的所有邮件都使用客户端的私钥进行签名。

我试图使用Spring的XWSS支持来实现这一点,如下所示:

http://docs.spring.io/spring-ws/site/reference/html/security.html

我面临的问题是我发出的消息没有签名,尽管我能说的是正确的配置。

我的applicationContext.xml如下:

<beans 
   xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:p="http://www.springframework.org/schema/p"
   xmlns:util="http://www.springframework.org/schema/util" 
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:tx="http://www.springframework.org/schema/tx" 
   xmlns:aop="http://www.springframework.org/schema/aop"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
                       http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                       http://www.springframework.org/schema/util
                       http://www.springframework.org/schema/util/spring-util-3.1.xsd
                       http://www.springframework.org/schema/context
                       http://www.springframework.org/schema/context/spring-context-3.1.xsd
                       http://www.springframework.org/schema/tx
                       http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
                       http://www.springframework.org/schema/aop
                       http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">

    ^
    |
    |
    B
    E
    A
    N
    S
    |
    |
    V

    <bean id="wsSecurityInterceptor"
         class="org.springframework.ws.soap.security.xwss.XwsSecurityInterceptor">
         <property name="policyConfiguration" value="classpath:securityPolicy.xml"/>
         <property name="callbackHandlers">
            <list>
               <ref bean="keyStoreHandler"/>
            </list>
         </property>
    </bean>

    <bean id="keyStoreHandler"
         class="org.springframework.ws.soap.security.xwss.callback.KeyStoreCallbackHandler">
         <property name="keyStore" ref="keyStore"/>
         <property name="privateKeyPassword" value="ckpass"/>
    </bean>

    <bean id="keyStore"
        class="org.springframework.ws.soap.security.support.KeyStoreFactoryBean">
        <property name="location" value="file:///C:/path/to/security/clientKeystore.jks"/>
        <property name="password" value="cspass"/>
    </bean>
</beans> 

我的securityPolicy.xml包含以下内容:

<xwss:SecurityConfiguration dumpMessages="true" xmlns:xwss="http://java.sun.com/xml/ns/xwss/config">
    <xwss:Sign>
   </xwss:Sign>
</xwss:SecurityConfiguration>

但是,当我发送消息并且发出的消息不包含我期望的签名元素时,没有消息被转储到标准输出。

我怀疑我在这里遗漏了一些相当微不足道的东西,但是我不知道这对我来说是什么意思!

1 个答案:

答案 0 :(得分:0)

在您的配置中,您只需配置拦截器。目前它只占用内存而只是无所事事。你应该将这个拦截器挂钩到你的WebServiceTemplate(或扩展WebServiceGatewaySupport的类。

假设你有其中一个你应该有这样的东西。

<bean id="yourClient" class="YourClientClass">
    <property name="interceptors" ref="wsSecurityInterceptor"/>
    // Your other properties here
</bean>

这将您的拦截器连接到所使用的WebServiceTemplate,没有拦截器基本上没有使用拦截器。