Установка нескольких доверенных хранилищ на одной JVM

У меня есть приложение Java, работающее на сервере веб-логики. В приложении есть два отдельных модуля, которые используют SSL для подключения к внешним веб-службам - скажем, модуль A и модуль B.

Модуль A - построен на Axis - использует хранилище доверенных сертификатов A Moudle B - построен на Spring-ws - использует хранилище доверенных сертификатов B.

Модуль А существует. Модуль B вводится.

Мне нужно иметь возможность динамически настраивать хранилище доверенных сертификатов в JVM в зависимости от того, какой модуль вызывается.

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

Я попытался использовать System.setProperty im Module B codebase для установки доверенного хранилища. Однако это работает только в том случае, если первым был вызван модуль B. Например - скажем, у меня есть новый перезапуск JVM, затем я вызываю модуль A - он устанавливает собственное хранилище доверенных сертификатов в JVM, затем я вызываю модуль B. System.setProperty метод.

Мне что-то не хватает, или просто System.setProperty не отменяет существующие установленные значения. Если да, то какие у меня здесь варианты.


person user825258    schedule 29.09.2011    source источник
comment
Зачем вам нужны два трастовых центра? Склад доверенных сертификатов только сообщает вам, каким центрам сертификации вы можете доверять для аутентификации однорангового узла. Почему это должно отличаться для каждого модуля?   -  person user207421    schedule 29.09.2011
comment
Пожалуйста, проверьте это, это может вам помочь: http://stackoverflow.com/questions/1793979/registering-multiple-keystores-in-jvm/   -  person Raz    schedule 12.08.2013


Ответы (1)


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

// load your key store as a stream and initialize a KeyStore
InputStream trustStream = ...    
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());    

// if your store is password protected then declare it (it can be null however)
char[] trustPassword = ...

// load the stream to your store
trustStore.load(trustStream, trustPassword);

// initialize a trust manager factory with the trusted store
TrustManagerFactory trustFactory = 
  TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());    
trustFactory.init(trustStore);

// get the trust managers from the factory
TrustManager[] trustManagers = trustFactory.getTrustManagers();

// initialize an ssl context to use these managers and set as default
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustManagers, null);
SSLContext.setDefault(sslContext);

Будьте осторожны, потому что SSLContext.getDefault() вернет вам контекст по умолчанию, который вы не можете изменить, поэтому вам нужно создать новый, инициализировать его, а затем установить этот новый < / em> context по умолчанию.

Суть в том, что вы можете использовать любое количество доверенных хранилищ, если хотите.

person Kohányi Róbert    schedule 29.09.2011