Вземете списък с надеждни сертификати в Java

Java Top

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА

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

Ще използваме класа PKIXParameters , който приема 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()); }

Класът PKIXParameters обикновено се използва за валидиране на сертификат, но в нашия пример ние просто го използвахме за точни сертификати от нашия KeyStore .

Когато създава екземпляр на PKIXParametrs , той изгражда списък на TrustAnchor, който ще съдържа надеждните сертификати, присъстващи в нашия KeyStore .

А TrustAnchor например просто представлява надежден сертификат.

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

В горния пример използвахме X509TrustManager , който е специализиран TrustManager, използван за удостоверяване на отдалечената част на 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.

Дъно на Java

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА