是否可以使用java密钥库配置WebServiceTemplate?
修改
我正在寻找一种在spring config
答案 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以编程方式加载密钥库:
所以也许有一个有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