Как инициализировать TrustManagerFactory с несколькими источниками доверия?JAVA

Программисты JAVA общаются здесь
Anonymous
Как инициализировать TrustManagerFactory с несколькими источниками доверия?

Сообщение Anonymous »

У моего приложения есть личный магазин ключей, содержащий доверенные саморегистрированные сертификаты для использования в локальной сети, - скажем, mykeystore.jks . Я хочу иметь возможность подключаться к общедоступным сайтам (скажем, Google.com), а также в моей локальной сети, используя саморегистрированные сертификаты, которые были предоставлены локально. < /p>

Проблема здесь заключается в том, что, когда я подключаюсь к https://google.com.

Код: Выделить всё

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
< /code>

Однако, если я импортирую сертификат CA в свой собственный магазин ключей (mykeystore.jks
) он работает нормально. Есть ли способ поддержать оба?

Код: Выделить всё

public class CustomX509TrustManager implements X509TrustManager {

X509TrustManager defaultTrustManager;

public MyX509TrustManager(KeyStore keystore) {
TrustManagerFactory trustMgrFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustMgrFactory.init(keystore);
TrustManager trustManagers[] = trustMgrFactory.getTrustManagers();
for (int i = 0; i < trustManagers.length; i++) {
if (trustManagers[i] instanceof X509TrustManager) {
defaultTrustManager = (X509TrustManager) trustManagers[i];
return;
}
}

public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
try {
defaultTrustManager.checkServerTrusted(chain, authType);
} catch (CertificateException ce) {
/* Handle untrusted certificates */
}
}
}
< /code>

i затем инициализируйте sslcontext, < /p>

TrustManager[] trustManagers =
new TrustManager[] { new CustomX509TrustManager(keystore) };
SSLContext customSSLContext =
SSLContext.getInstance("TLS");
customSSLContext.init(null, trustManagers, null);
< /code>

и установите фабрику сокета, < /p>

HttpsURLConnection.setDefaultSSLSocketFactory(customSSLContext.getSocketFactory());
< /code>

Основная программа, < /p>

URL targetServer = new URL(url);
HttpsURLConnection conn = (HttpsURLConnection) targetServer.openConnection();
Если я не устанавливаю своих собственных управляющих доверия, он подключается к https://google.com. Как получить «менеджер доверия по умолчанию», который указывает на магазин ключей по умолчанию?

Подробнее здесь: https://stackoverflow.com/questions/231 ... s-of-trust

Вернуться в «JAVA»