将WebServiceTemplate与密钥库一起使用

时间:2010-03-10 19:14:27

标签: java spring ssl spring-ws

是否可以使用java密钥库配置WebServiceTemplate?

修改
我正在寻找一种在spring config

中配置密钥库位置的方法

6 个答案:

答案 0 :(得分:11)

我在六年后发布这个答案,但说实话,没有一个帖子提供完整而简洁的解决方案。您所需要的只是spring-ws-core(2.1.4.RELEASE +)和spring-we-security(2.2.4.RELEASE +)依赖项。下一步是将自定义密钥库和信任库配置为bean,然后在spring配置中将它们注入Web服务模板。

<bean id="myKeyStore" class="org.springframework.ws.soap.security.support.KeyStoreFactoryBean">
	<property name="location" value="file:/tmp/config/my-keystore.jks"/>
	<property name="password" value="password"/>
</bean>

<bean id="myTrustStore" class="org.springframework.ws.soap.security.support.KeyStoreFactoryBean">
	<property name="location" value="file:/tmp/config/my-truststore.jks"/>
	<property name="password" value="different_password"/>
</bean>

<bean id="template" class="org.springframework.ws.client.core.WebServiceTemplate">
    <property name="messageSender">
        <bean class="org.springframework.ws.transport.http.HttpsUrlConnectionMessageSender">
            <property name="trustManagers">
		<bean class="org.springframework.ws.soap.security.support.TrustManagersFactoryBean">
			<property name="keyStore" ref="mytrustStore" />
		</bean>
	    </property>
	    <property name="keyManagers">
		<bean class="org.springframework.ws.soap.security.support.KeyManagersFactoryBean">
			<property name="keyStore" ref="myKeyStore" />
			<property name="password" value="password" />
		</bean>
	   </property>
        </bean>
    </property>
</bean>

总之,不需要编写任何代码,使用spring config可以轻松实现用例。

答案 1 :(得分:2)

我在这篇文章中找到的答案和问题让我一直在追尾。最后,我通过将密钥库导入Weblogic服务器上的密钥库来部署到WebLogic 11g的应用程序:

C:\ bea \ jrockit_160_14_R27.6.5-32 \ jre \ bin&gt; keytool -importkeystore -srckeystore \ workspace \ myProject \ webservice.keystore

然后我将WebLogic密钥库的配置更改为指向此密钥库。您可以通过WL控制台执行此操作:环境 - &gt;服务器 - &gt;管理服务器 - &gt;密钥库。 将密钥库:选择更改为“自定义标识和自定义信任”,然后填写标识(传入)和信任中的路径(传出)部分到您的密钥库位置。在Windows XP上,我的是\ Documents an Settings \ my id \ .keystore。

我没有提供密码,我相信它是可选的。

答案 2 :(得分:1)

我认为您可以使用KeyStore.Builder以编程方式加载密钥库:

http://java.sun.com/j2se/1.5.0/docs/api/java/security/KeyStore.Builder.html#newInstance%28java.lang.String,%20java.security.Provider,%20java.io.File,%20java.security.KeyStore.ProtectionParameter%29

所以也许有一个有web服务模板或扩展它的类,然后在你的spring配置中设置keystore的文件路径并使它成为一个inizialing bean(Spring 3中的@PostConstruct?)然后加载keystore

File f = new File(keyStorePath);
KeyStore.Builder builder = KeyStore.Builder.newInstance("type",provider,file,protection);
KeyStore keystore = builder.getKeyStore();

好的 - 实际上将它与webservicetemplate一起使用我认为它必须基于密钥库回调,如下所示:http://static.springsource.org/spring-ws/sites/1.5/reference/html/security.html#d0e4462

或者可以使用spring org.springframework.ws.transport.http.HttpsUrlConnectionMessageSender,您可以在其上设置keystoremanager。然后,您的webservicetemplate可以使用它。

有点像这样:

<bean id="template" class="org.springframework.ws.client.core.WebServiceTemplate">
    <property name="messageSender">
        <bean class="org.springframework.ws.transport.http.HttpsUrlConnectionMessageSender">
            <property name=""></property>
        </bean>
    </property>
</bean>

HTH

答案 3 :(得分:1)

这个帖子的延迟回复但无论如何:请注意,一旦你拥有了你的密钥库和其他所有设置,你可能会惊讶地发现WebServiceTemplate似乎不支持HTTPS连接!

确保将messageSender属性设置为org.springframework.ws.transport.http.CommonsHttpMessageSender。默认的WebServiceMessageSender实施不支持HTTPS。

答案 4 :(得分:1)

我假设您的意思是要配置JSSE使用的密钥库,因为这是模板将使用的。 JSSE将始终始终查看javax.net.ssl.keyStore / javax.net.ssl.keyStorePassword系统属性以查找密钥库。您可以使用类似这样的InitializingBean在Spring中配置这些属性。

请注意,如果您在应用服务器中运行,则可能已在Spring初始化之前配置JSSE。在这种情况下,您需要使用app服务器界面来设置密钥库 - 通常在命令行上使用-D params。

<bean id="jsseInitializer" lazy-init="false" class="com.blah.JsseInitializer">
        <property name="trustStoreLocation" value="${pnet.batch.trustStore.location}"/>
        <property name="trustStorePassword" value="${pnet.batch.trustStore.password}"/>
        <property name="keyStoreLocation" value="${pnet.batch.keyStore.location}"/>
        <property name="keyStorePassword" value="${pnet.batch.keyStore.password}"/>
</bean>


public class JsseInitializer implements InitializingBean {

    private String trustStoreLocation;
    private String trustStorePassword;
    private String keyStoreLocation;
    private String keyStorePassword;

    public String getTrustStoreLocation() {
        return trustStoreLocation;
    }


    public void setTrustStoreLocation(String trustStoreLocation) {
        this.trustStoreLocation = trustStoreLocation;
    }


    public String getTrustStorePassword() {
        return trustStorePassword;
    }


    public void setTrustStorePassword(String trustStorePassword) {
        this.trustStorePassword = trustStorePassword;
    }


    public String getKeyStoreLocation() {
        return keyStoreLocation;
    }


    public void setKeyStoreLocation(String keyStoreLocation) {
        this.keyStoreLocation = keyStoreLocation;
    }


    public String getKeyStorePassword() {
        return keyStorePassword;
    }


    public void setKeyStorePassword(String keyStorePassword) {
        this.keyStorePassword = keyStorePassword;
    }

    public void afterPropertiesSet() throws Exception {
        System.setProperty("javax.net.ssl.trustStore", trustStoreLocation);
        System.setProperty("javax.net.ssl.trustStorePassword", trustStorePassword);
        System.setProperty("javax.net.ssl.keyStore", keyStoreLocation);
        System.setProperty("javax.net.ssl.keyStorePassword", keyStorePassword);

    }
}

答案 5 :(得分:0)

您应该使用keytool命令在用于运行应用服务器的JDK的密钥库(可能是cacerts文件)中安装所需的证书。

以下是一个示例命令:

keytool -import -trustcacerts -alias someAlias -file someCert.crt -keystore yourKeystore

修改:根据更新后的问题,您可能会看到以下内容:http://static.springsource.org/spring-ws/sites/1.5/reference/html/security.html