Holen Sie sich eine Liste vertrauenswürdiger Zertifikate in Java

Java Top

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs

1. Übersicht

In diesem kurzen Tutorial erfahren Sie anhand schneller und praktischer Beispiele, wie Sie eine Liste vertrauenswürdiger Zertifikate in Java lesen.

2. Laden des KeyStore

Java speichert die vertrauenswürdigen Zertifikate in einer speziellen Datei namens cacerts , die sich in unserem Java-Installationsordner befindet.

Beginnen wir damit, diese Datei zu lesen und in den KeyStore zu laden :

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

Das Standardkennwort für diesen KeyStore lautet "changeit" . Es kann jedoch anders sein, wenn es zuvor in unserem System geändert wurde.

Nach dem Laden enthält der KeyStore unsere vertrauenswürdigen Zertifikate. Als Nächstes erfahren Sie, wie Sie diese lesen.

3. Lesen von Zertifikaten aus einem angegebenen KeyStore

Wir werden die PKIXParameters- Klasse verwenden, die einen KeyStore als Konstruktorparameter verwendet:

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

Die PKIXParameters- Klasse wird normalerweise zum Überprüfen eines Zertifikats verwendet. In unserem Beispiel haben wir sie jedoch einfach verwendet, um die Zertifikate aus unserem KeyStore zu ermitteln .

Beim Erstellen einer Instanz von PKIXParametrs wird eine Liste von TrustAnchor erstellt , die die in unserem KeyStore vorhandenen vertrauenswürdigen Zertifikate enthält .

Eine TrustAnchor- Instanz repräsentiert einfach ein vertrauenswürdiges Zertifikat.

4. Lesen von Zertifikaten aus dem Standard- KeyStore

Wir können auch eine Liste der in unserem System vorhandenen vertrauenswürdigen Zertifikate abrufen , indem wir die TrustManagerFactory- Klasse verwenden und sie ohne einen KeyStore initialisieren , der den Standard- KeyStore verwendet .

Wenn wir keinen KeyStore explizit bereitstellen , wird standardmäßig derselbe aus dem vorherigen Kapitel verwendet:

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

Im obigen Beispiel haben wir X509TrustManager verwendet , einen spezialisierten TrustManager , mit dem der Remote-Teil einer SSL-Verbindung authentifiziert wird.

Beachten Sie, dass dieses Verhalten von der spezifischen JDK-Implementierung abhängen kann, da die Spezifikation nicht definiert, was passieren soll, wenn der Parameter init () KeyStore null ist .

5. Zertifikat Aliase

Ein Zertifikatalias ist einfach eine Zeichenfolge , die ein Zertifikat eindeutig identifiziert.

Unter den von Java importierten Standardzertifikaten gibt es auch ein bekanntes Zertifikat von GoDaddy, einem Registrar für öffentliche Internetdomänen, das wir in unseren Tests verwenden werden:

String GODADDY_CA_ALIAS = "godaddyrootg2ca [jdk]";

Mal sehen, wie wir alle in unserem KeyStore vorhandenen Zertifikat-Aliase lesen können :

@Test public void whenLoadingKeyStore_thenGoDaddyCALabelIsPresent() { KeyStore keyStore = loadKeyStore(); Enumeration aliasEnumeration = keyStore.aliases(); List aliases = Collections.list(aliasEnumeration); assertTrue(aliases.contains(GODADDY_CA_ALIAS)); }

Im nächsten Beispiel sehen wir, wie wir ein Zertifikat anhand seines Alias ​​abrufen können:

@Test public void whenLoadingKeyStore_thenGoDaddyCertificateIsPresent() { KeyStore keyStore = loadKeyStore(); Certificate goDaddyCertificate = keyStore.getCertificate(GODADDY_CA_ALIAS); assertNotNull(goDaddyCertificate); }

6. Fazit

In diesem kurzen Artikel haben wir uns anhand schneller und praktischer Beispiele mit verschiedenen Möglichkeiten befasst, vertrauenswürdige Zertifikate in Java aufzulisten.

Wie immer finden Sie Code-Schnipsel auf GitHub.

Java unten

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs