Настройка нескольких хранилищ доверенных сертификатов на одной и той же виртуальной машине Java - PullRequest
8 голосов
/ 29 сентября 2011

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

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

Модуль A существует.Вводится модуль B.

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

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

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

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

1 Ответ

16 голосов
/ 29 сентября 2011

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

// 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() вернет вам контекст по умолчанию , который вы не сможете изменить , поэтому вам нужно создать новый, инициализировать его и установить новый контекст по умолчанию.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...