Рубрики
Без рубрики

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

Узнайте, как прочитать список доверенных сертификатов на Java на быстрых и практических примерах

Автор оригинала: Cristian Rosu.

1. Обзор

В этом быстром учебнике мы научимся читать список доверенных сертификатов на Java на быстрых и практических примерах.

2. Загрузка KeyStore

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;
}

Пароль по умолчанию для этого KeyStore есть “changeit” , но это может быть по-другому, если он был ранее изменен в нашей системе.

После загрузки KeyStore будет держать наши доверенные сертификаты, а затем, мы увидим, как их читать.

3. Сертификаты чтения из указанного KeyStore

Мы будем использовать PKIXПараметерс класс, который занимает KeyStore в качестве параметра конструктора:

@Test
public void whenLoadingCacertsKeyStore_thenCertificatesArePresent() {
    KeyStore keyStore = loadKeyStore();
    PKIXParameters params = new PKIXParameters(keyStore);

    Set trustAnchors = params.getTrustAnchors();
    List certificates = trustAnchors.stream()
      .map(TrustAnchor::getTrustedCert)
      .collect(Collectors.toList());

    assertFalse(certificates.isEmpty());
}

PKIXПараметерс класс обычно используется для проверки сертификата, но в нашем примере мы просто использовали его для получения сертификатов от наших KeyStore .

При создании экземпляра PKIXПараметы , он строит список ТрастАнчор которые будут содержать доверенные сертификаты, присутствующие в нашем KeyStore .

ТрастАнчор экземпляр просто представляет собой доверенный сертификат.

4. Чтение сертификатов от KeyStore по умолчанию

Мы также можем получить список доверенных сертификатов, присутствующих в нашей системе, с помощью TrustManagerFactory класса и инициализации его без KeyStore , который будет использовать по умолчанию KeyStore .

Если мы не предоставим KeyStore очевидно, что тот же самый из предыдущей главы будет использоваться по умолчанию:

@Test
public void whenLoadingDefaultKeyStore_thenCertificatesArePresent() {
    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    trustManagerFactory.init((KeyStore) null);

    List trustManagers = Arrays.asList(trustManagerFactory.getTrustManagers());
    List 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());
}

В приведеном выше примере мы использовали X509ТрустМенагер , который является специализированным ТрастМенагер используется для аутентификация удаленной части системы соединения SSL .

Обратите внимание, что такое поведение может зависеть от конкретной реализации JDK, спецификация не определяет, что должно произойти в случае init () KeyStore параметр нулевой .

5. Сертификат Псевдонимы

Псевдоним сертификата — это просто Струнные который однозначно идентифицирует сертификат.

Среди сертификатов по умолчанию, импортированных Java, есть также известный сертификат, выданный GoDaddy, регистратором общественного интернет-домена, который мы будем использовать в наших тестах:

String GODADDY_CA_ALIAS = "godaddyrootg2ca [jdk]";

Давайте посмотрим, как мы можем прочитать все псевдонимы сертификатов, присутствующих в нашем KeyStore :

@Test
public void whenLoadingKeyStore_thenGoDaddyCALabelIsPresent() {
    KeyStore keyStore = loadKeyStore();

    Enumeration aliasEnumeration = keyStore.aliases();
    List 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 .