问题 将WebServiceTemplate与密钥库一起使用


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

编辑
我正在寻找一种在spring配置中配置密钥库位置的方法


10581
2018-03-10 19:14


起源



答案:


我认为您可以使用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。文件%20java.security.KeyStore.ProtectionParameter 29%

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

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


1
2018-03-11 17:04





我在六年后发布了这个答案,但说实话,没有一个帖子提供完整而简洁的解决方案。您只需要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配置可以轻松实现用例。


11
2018-06-01 01:24





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

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

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

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


2
2018-03-07 23:06





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

确保你设置了 messageSender 财产 org.springframework.ws.transport.http.CommonsHttpMessageSender。默认值 WebServiceMessageSender 实现不支持HTTPS。


1
2018-06-24 07:59





我假设你想要配置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);

    }
}

1
2017-07-15 15:42





您应该使用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


0
2018-03-10 19:23



@Taylor L - 谢谢,虽然我真的想找到一种在春天配置密钥库位置的方法。我会更新我的问题以反映这一点。 - Mark Pope
看看这个: static.springsource.org/spring-ws/sites/1.5/reference/html/... - Taylor Leese
L - 是的,该页面是一个很好的参考。但是我如何将WebServiceTemplate与密钥库连接起来...... - Mark Pope


答案:


我认为您可以使用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。文件%20java.security.KeyStore.ProtectionParameter 29%

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

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


1
2018-03-11 17:04





我在六年后发布了这个答案,但说实话,没有一个帖子提供完整而简洁的解决方案。您只需要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配置可以轻松实现用例。


11
2018-06-01 01:24





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

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

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

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


2
2018-03-07 23:06





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

确保你设置了 messageSender 财产 org.springframework.ws.transport.http.CommonsHttpMessageSender。默认值 WebServiceMessageSender 实现不支持HTTPS。


1
2018-06-24 07:59





我假设你想要配置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);

    }
}

1
2017-07-15 15:42





您应该使用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


0
2018-03-10 19:23



@Taylor L - 谢谢,虽然我真的想找到一种在春天配置密钥库位置的方法。我会更新我的问题以反映这一点。 - Mark Pope
看看这个: static.springsource.org/spring-ws/sites/1.5/reference/html/... - Taylor Leese
L - 是的,该页面是一个很好的参考。但是我如何将WebServiceTemplate与密钥库连接起来...... - Mark Pope