Перейти к основному содержимому

Получить список доверенных сертификатов в Java

· 3 мин. чтения

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 .