Использование WebServiceTemplate с хранилищем ключей - PullRequest
11 голосов
/ 10 марта 2010

Можно ли настроить шаблон WebServiceTemplate с хранилищем ключей Java?

редактировать
Я ищу способ настроить расположение хранилища ключей в весеннем конфиге

Ответы [ 6 ]

11 голосов
/ 01 июня 2016

Я публикую этот ответ через шесть лет, но, честно говоря, нет ни одного поста, в котором бы содержалось полное и сжатое решение. Все, что вам нужно, это зависимости spring-ws-core (2.1.4.RELEASE +) и spring-we-security (2.2.4.RELEASE +). Следующим шагом является настройка пользовательского хранилища ключей и хранилища доверенных сертификатов в виде bean-компонентов, а затем внедрение их в шаблон веб-службы в весенней конфигурации.

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

2 голосов
/ 08 марта 2012

Ответы и вопросы, которые я нашел в этом посте, заставляли меня некоторое время гоняться за хвостом. В конце концов я получил эту работу для приложения, которое развернуло в WebLogic 11g, импортировав хранилище ключей в хранилище ключей на моем сервере Weblogic:

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

Затем я изменил конфигурацию хранилища ключей WebLogic, указав на это хранилище ключей. Вы можете сделать это через консоль WL: Environment-> Servers-> AdminServer-> Keystores . Измените Keystores: выбор на «Пользовательская идентификация и пользовательское доверие» , затем введите путь в разделах Identity (входящие) и Доверие (исходящие) в ваше местоположение хранилища ключей. В Windows XP мое было в \ Documents a Settings \ my id \ .keystore.

Я не предоставил парольную фразу и считаю, что это необязательно.

1 голос
/ 15 июля 2010

Я предполагаю, что вы хотите настроить хранилище ключей, используемое JSSE, так как именно этот шаблон будет использовать. JSSE всегда будет всегда искать системные свойства javax.net.ssl.keyStore / javax.net.ssl.keyStorePassword, чтобы найти хранилище ключей. Вы можете настроить эти свойства в Spring с помощью InitializingBean следующим образом.

Обратите внимание, что если вы работаете на сервере приложений, JSSE может быть уже настроен до инициализации Spring. В этом случае вам нужно использовать интерфейс сервера приложений для установки хранилища ключей - обычно с помощью параметра -D в командной строке.

<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 голос
/ 24 июня 2010

Поздний ответ в этой теме, но в любом случае: обратите внимание, что после того, как у вас настроено хранилище ключей и все остальное, вы можете быть шокированы, обнаружив, что WebServiceTemplate, похоже, не поддерживает HTTPS-соединения!

Убедитесь, что для свойства messageSender установлено значение org.springframework.ws.transport.http.CommonsHttpMessageSender. Реализация по умолчанию WebServiceMessageSender не поддерживает HTTPS.

1 голос
/ 11 марта 2010

Я думаю, что вы можете программно загрузить хранилище ключей, используя 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

Так что, возможно, есть класс, который имеет шаблон веб-сервиса или расширяет его, затем задайте путь к файлу хранилища ключей в нем в вашей конфигурации Spring и сделайте его начальным компонентом (@PostConstruct в Spring 3?), Который затем загружает хранилище ключей .

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

Или, может быть, с помощью пружины 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>

НТН

0 голосов
/ 10 марта 2010

Вы должны установить необходимые сертификаты в хранилище ключей (вероятно, файл cacerts) JDK, который использовался для запуска сервера приложений с помощью команды они keytool.

Вот пример команды:

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

Редактировать : Исходя из обновленного вопроса, похоже, что это то, что вы ищете: http://static.springsource.org/spring-ws/sites/1.5/reference/html/security.html

...