Автор оригинала: 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); SettrustAnchors = 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); ListtrustManagers = 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(); EnumerationaliasEnumeration = 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 .