Список сертификатов в хранилище доверенных сертификатов JVM

Я определил собственное хранилище доверенных сертификатов через системные свойства:

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

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


person Carlos    schedule 16.01.2012    source источник
comment
Вы пробовали опцию keytool -list?   -  person kosa    schedule 16.01.2012
comment
@thinksteep: для этого потребуется отдельный инструмент   -  person Carlos    schedule 16.01.2012


Ответы (1)


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

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

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

ИЗМЕНИТЬ:

Для получения более подробной информации вы можете посмотреть реализацию в 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, когда параметр хранилища ключей имеет значение null).

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

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

РЕДАКТИРОВАТЬ 2:

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

person Bruno    schedule 16.01.2012
comment
Невероятно, это работает. Я скопировал код из getCacertsKeyStore в TrustManagerFactoryImpl и вызвал его с помощью defaultctx. Спасибо! - person Afforess; 16.02.2013