Листинг сертификатов в хранилище доверия JVM

Я определил пользовательский супермаркет через системные свойства:

System.setProperty("javax.net.ssl.trustStore", ...);
System.setProperty("javax.net.ssl.trustStorePassword", ...);

Учитывая, что VM уже занимается загрузкой файла, я хотел бы перечислить эти загруженные сертификаты. Я не хочу снова загружать доверительный магазин в поток и получать сертификаты оттуда, но я хочу увидеть те, которые VM уже загрузила сама по себе. Кроме того, я хочу видеть их из моего собственного приложения, не используя отдельный инструмент. Я сделал некоторые поисковые запросы, но до сих пор я не смог найти это.

Ответ 1

Когда они используются, JSSE использует эти параметры для построения своего стандартного X509TrustManager (переопределения значения по умолчанию JRE). Однако в API JSSE нет ничего, чтобы получить доступ к хранилищу ключей, с которым был создан менеджер доверия по умолчанию, поскольку в архитектуре JSSE доверительный менеджер по умолчанию не должен строиться из хранилища ключей в принципе.

Если вы хотите прочитать содержимое хранилища доверия, прошедшего через свойства javax.net.ssl.trustStore*, вам придется открыть файл самостоятельно.

Самое близкое, что вы можете получить, будет по умолчанию X509TrustManager по умолчанию TrustManagerFactory.

EDIT:

Для более подробной информации вы можете посмотреть реализацию в OpenJDK.

Логика sun.security.ssl.DefaultSSLContextImpl (не является частью публичного API) заключается в инициализации TrustManagerFactory с помощью KeyStore из TrustManagerFactoryImpl (который также не является частью публичного API):

KeyStore ks = TrustManagerFactoryImpl.getCacertsKeyStore("defaultctx");
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);

Это согласуется с поведением TrustManagerFactory с tmf.init(null). Это также зависит от хранилища ключей по умолчанию, но это задокументировано в публичном API. В самом деле, реализация (с tmf.init(null)) заканчивается тем же, что показано в TrustManagerFactoryImpl (engineInit также вызывает getCacertsKeyStore > , когда параметр keystore равен нулю).

В обоих случаях переменная KeyStore не сохраняется в члене класса, это просто локальная переменная, недоступная после использования этих методов инициализации.

Полученный X509TrustManagerImpl действительно содержит список доверенных сертификатов, но (a) trustedCerts является частным членом и ( б) все это не является частью публичного API JSSE.

ИЗМЕНИТЬ 2:

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