Использование WebServiceTemplate с хранилищем ключей

StackOverflow https://stackoverflow.com/questions/2419791

  •  19-09-2019
  •  | 
  •  

Вопрос

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

Редактировать
Я ищу способ настроить расположение хранилища ключей в spring config

Это было полезно?

Решение

Я думаю, вы можете программно загрузить хранилище ключей на основе хранилища ключей.Конструктор:

http://java.sun.com/j2se/1.5.0/docs/api/java/security/KeyStore .Builder.html#newInstance%28java.lang.Строка,%20java.security.Поставщик,%20java.io.File,%20java.security.Хранилище ключей.Параметр защиты%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

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

Другие советы

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

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

В summery нет необходимости писать какой-либо код, вариант использования может быть легко достигнут с помощью spring config.

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

C:\bea\jrockit_160_14_R27.6.5-32\jre\bin >keytool -importkeystore -хранилище ключей srckeystore \workspace\MyProject\webservice.хранилище ключей

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

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

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

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

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

    }
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top