Как установить другое хранилище ключей склада доверенных сертификатов с помощью setProperty - PullRequest
0 голосов
/ 11 января 2020

У меня есть фиксированный клиент, который вызывает фиксированный сервер, используя разные хранилища ключей (одно хранилище ключей для компании). В моем java каждый раз, когда я устанавливаю системные свойства trustStore и keyStore следующим образом:

..reading path and password from database..
System.setProperty("javax.net.ssl.trustStore", ..path..);
System.setProperty("javax.net.ssl.trustStorePassword", ..password..);
System.setProperty("javax.net.ssl.keyStore", ..path..);
System.setProperty("javax.net.ssl.keyStorePassword", ..password);

Таким образом, он работает только при первом обращении к серверу (пример «Компания A»). Когда я пытаюсь вызвать сервер с другим хранилищем ключей (например, «Компания B»), ответ от сервера:

javax.xml.ws.soap.SOAPFaultException: IDP Rule 'Process Error' aborted processing.

Это потому, что System.setProperty не обновляется каждый раз, поэтому после первого раза клиент У меня всегда есть хранилище ключей "Компания А". Я пытался также положить все сертифицированные в одном хранилище ключей, но это не работает. В этом случае все пароли должны быть одинаковыми, я думаю. Некоторые идеи?

Обновление после ответа Misantrops

Я пытался с этим кодом:

KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());

InputStream trustStore1 = new FileInputStream(path1);
keyStore.load(trustStore1, password1.toCharArray());
trustStore1.close();

InputStream trustStore2 = new FileInputStream(path2);
keyStore.load(trustStore2, password2.toCharArray());
trustStore2.close();

InputStream trustStore3 = new FileInputStream(path3);
keyStore.load(trustStore3, password3.toCharArray());
trustStore3.close();

TrustManagerFactory tmf =  TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keyStore);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, tmf.getTrustManagers(), null);
SSLSocketFactory sslFactory = ctx.getSocketFactory();

Возвращает эту ошибку:

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target.] with root cause

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

1 Ответ

0 голосов
/ 13 января 2020

Наконец-то я нашел решение:

    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());

    String path1 = ..absolute path of keystore..
    path1 = path1.replaceAll("%20", " ");
    InputStream trustStore1 = new FileInputStream(path1);
    keyStore.load(trustStore1, new String(..keystore password..).toCharArray());
    trustStore1.close();

    KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
    keyManagerFactory.init(keyStore, new String(..keystore password..).toCharArray());

    TrustManagerFactory tmf =  TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(keyStore);
    SSLContext ctx = SSLContext.getInstance("SSL");
    ctx.init(keyManagerFactory.getKeyManagers(), tmf.getTrustManagers(), null);
    HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());

Можно изменить во время выполнения хранилище ключей, просто используя метод "init" объекта SSLContext. Параметры этой функции - KeyManager и TrustManager, инициализированные как в скрипте. Таким образом, таким образом можно моделировать System.setProperty. Спасибо всем!

...