1. Обзор
В этом кратком руководстве мы научимся читать список доверенных сертификатов в Java на быстрых и практических примерах.
2. Загрузка хранилища ключей
Java хранит доверенные сертификаты в специальном файле с именем cacerts
, который находится в папке установки Java.
Давайте начнем с чтения этого файла и загрузки его в KeyStore
:
private KeyStore loadKeyStore() {
String relativeCacertsPath = "/lib/security/cacerts".replace("/", File.separator);
String filename = System.getProperty("java.home") + relativeCacertsPath;
FileInputStream is = new FileInputStream(filename);
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
String password = "changeit";
keystore.load(is, password.toCharArray());
return keystore;
}
Пароль по умолчанию для этого хранилища ключей
— «changeit»
, но он может быть другим, если он ранее был изменен в нашей системе.
После загрузки в KeyStore
будут храниться наши доверенные сертификаты, а затем мы увидим, как их читать.
3. Чтение сертификатов из указанного хранилища ключей
Мы собираемся использовать класс PKIXParameters
, который принимает KeyStore
в качестве параметра конструктора:
@Test
public void whenLoadingCacertsKeyStore_thenCertificatesArePresent() {
KeyStore keyStore = loadKeyStore();
PKIXParameters params = new PKIXParameters(keyStore);
Set<TrustAnchor> trustAnchors = params.getTrustAnchors();
List<Certificate> certificates = trustAnchors.stream()
.map(TrustAnchor::getTrustedCert)
.collect(Collectors.toList());
assertFalse(certificates.isEmpty());
}
Класс PKIXParameters
обычно используется для проверки сертификата, но в нашем примере мы просто использовали его для получения сертификатов из нашего хранилища ключей
.
При создании экземпляра PKIXParametrs
он создает список TrustAnchor
, который будет содержать доверенные сертификаты, присутствующие в нашем KeyStore
.
Экземпляр TrustAnchor
просто представляет доверенный сертификат.
4. Чтение сертификатов из хранилища ключей по умолчанию
Мы также можем получить список доверенных сертификатов, присутствующих в нашей системе, используя класс TrustManagerFactory
и инициализировав его без KeyStore
, который будет использовать KeyStore
по умолчанию .
Если мы не предоставим KeyStore
явно, по умолчанию будет использоваться то же самое из предыдущей главы:
@Test
public void whenLoadingDefaultKeyStore_thenCertificatesArePresent() {
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore) null);
List<TrustManager> trustManagers = Arrays.asList(trustManagerFactory.getTrustManagers());
List<X509Certificate> certificates = trustManagers.stream()
.filter(X509TrustManager.class::isInstance)
.map(X509TrustManager.class::cast)
.map(trustManager -> Arrays.asList(trustManager.getAcceptedIssuers()))
.flatMap(Collection::stream)
.collect(Collectors.toList());
assertFalse(certificates.isEmpty());
}
В приведенном выше примере мы использовали X509TrustManager
, специализированный TrustManager,
используемый для аутентификации удаленной части SSL-соединения .
Обратите внимание, что такое поведение может зависеть от конкретной реализации JDK, поскольку спецификация не определяет, что должно произойти, если параметр init()
KeyStore
имеет значение null
.
5. Псевдонимы сертификатов
Псевдоним сертификата — это просто строка
, которая однозначно идентифицирует сертификат.
Среди сертификатов по умолчанию, импортированных Java, есть также известный сертификат, выпущенный GoDaddy, общедоступным регистратором интернет-доменов, который мы будем использовать в наших тестах:
String GODADDY_CA_ALIAS = "godaddyrootg2ca [jdk]";
Давайте посмотрим, как мы можем прочитать все псевдонимы сертификатов, присутствующие в нашем KeyStore
:
@Test
public void whenLoadingKeyStore_thenGoDaddyCALabelIsPresent() {
KeyStore keyStore = loadKeyStore();
Enumeration<String> aliasEnumeration = keyStore.aliases();
List<String> aliases = Collections.list(aliasEnumeration);
assertTrue(aliases.contains(GODADDY_CA_ALIAS));
}
В следующем примере мы увидим, как мы можем получить сертификат по его псевдониму:
@Test
public void whenLoadingKeyStore_thenGoDaddyCertificateIsPresent() {
KeyStore keyStore = loadKeyStore();
Certificate goDaddyCertificate = keyStore.getCertificate(GODADDY_CA_ALIAS);
assertNotNull(goDaddyCertificate);
}
6. Заключение
В этой быстрой статье мы рассмотрели различные способы перечисления доверенных сертификатов в Java на быстрых и практических примерах.
Как всегда, фрагменты кода можно найти на GitHub .