Ontvang een lijst met vertrouwde certificaten in Java

Java Top

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

1. Overzicht

In deze korte zelfstudie leren we aan de hand van snelle en praktische voorbeelden een lijst met vertrouwde certificaten in Java te lezen.

2. Laden van het KeyStore

Java slaat de vertrouwde certificaten op in een speciaal bestand met de naam cacerts dat leeft in onze Java-installatiemap.

Laten we beginnen met het lezen van dit bestand en het laden in het KeyStore:

private KeyStore loadKeyStore () {String relatieveCacertsPath = "/lib/security/cacerts".replace("/", File.separator); String bestandsnaam = System.getProperty ("java.home") + relatieveCacertsPath; FileInputStream is = nieuwe FileInputStream (bestandsnaam); KeyStore keystore = KeyStore.getInstance (KeyStore.getDefaultType ()); String wachtwoord = "changeit"; keystore.load (is, wachtwoord.toCharArray ()); keystore teruggeven; }

Het standaard wachtwoord hiervoor KeyStore is "verander het", maar het kan anders zijn als het eerder in ons systeem is gewijzigd.

Eenmaal geladen, de KeyStore zal onze vertrouwde certificaten hebben, en vervolgens zullen we zien hoe we ze kunnen lezen.

3. Certificaten lezen van een gespecificeerd KeyStore

We gaan de PKIXParameters klasse, waarvoor een KeyStore als een constructorparameter:

@ Test openbare ongeldig whenLoadingCacertsKeyStore_thenCertificatesArePresent () {KeyStore keyStore = loadKeyStore (); PKIXParameters params = nieuwe PKIXParameters (keyStore); Stel trustAnchors = params.getTrustAnchors (); Lijst met certificaten = trustAnchors.stream () .map (TrustAnchor :: getTrustedCert) .collect (Collectors.toList ()); assertFalse (certificaten.isEmpty ()); }

De PKIXParameters class wordt meestal gebruikt voor het valideren van een certificaat, maar in ons voorbeeld hebben we het gewoon gebruikt om de certificaten van ons af te vragen KeyStore.

Bij het maken van een instantie van PKIXParametrsbouwt het een lijst op van TrustAnchor dat de vertrouwde certificaten bevat die aanwezig zijn in ons KeyStore.

EEN TrustAnchor instantie vertegenwoordigt eenvoudigweg een vertrouwd certificaat.

4. Standaardcertificaten lezen KeyStore

We kunnen ook een lijst krijgen van de vertrouwde certificaten die in ons systeem aanwezig zijn door de ... gebruiken TrustManagerFactory class en initialiseren zonder een KeyStore, die de standaard zal gebruiken KeyStore.

Als we geen KeyStore expliciet wordt dezelfde versie uit het vorige hoofdstuk standaard gebruikt:

@Test openbare leegte whenLoadingDefaultKeyStore_thenCertificatesArePresent () {TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance (TrustManagerFactory.getDefaultAlgorithm ()); trustManagerFactory.init ((KeyStore) null); Lijst trustManagers = Arrays.asList (trustManagerFactory.getTrustManagers ()); Lijst met certificaten = trustManagers.stream () .filter (X509TrustManager.class :: isInstance) .map (X509TrustManager.class :: cast) .map (trustManager -> Arrays.asList (trustManager.getAcceptedIssuers ())) .flatMap (Collectie: : stream) .collect (Collectors.toList ()); assertFalse (certificaten.isEmpty ()); }

In het bovenstaande voorbeeld hebben we gebruikt X509TrustManager, dat is een gespecialiseerd TrustManager gebruikt om het externe deel van een SSL-verbinding te authenticeren.

Merk op dat dit gedrag kan afhangen van de specifieke JDK-implementatie, aangezien de specificatie niet definieert wat er moet gebeuren in het geval de in het()KeyStore parameter is nul.

5. Certificaat Aliassen

Een certificaatalias is gewoon een Draad waarmee een certificaat op unieke wijze wordt geïdentificeerd.

Onder de standaardcertificaten die door Java worden geïmporteerd, is er ook een bekend certificaat dat is uitgegeven door GoDaddy, een openbare internetdomeinregistrar, die we zullen gebruiken in onze tests:

String GODADDY_CA_ALIAS = "godaddyrootg2ca [jdk]";

Laten we eens kijken hoe we alle certificaataliassen kunnen lezen die aanwezig zijn in ons KeyStore:

@Test openbare leegte whenLoadingKeyStore_thenGoDaddyCALabelIsPresent () {KeyStore keyStore = loadKeyStore (); Opsomming aliasEnumeration = keyStore.aliases (); Lijst aliassen = Collections.list (aliasEnumeration); assertTrue (aliases.contains (GODADDY_CA_ALIAS)); }

In het volgende voorbeeld zullen we zien hoe we een certificaat kunnen ophalen via zijn alias:

@ Test openbare ongeldig whenLoadingKeyStore_thenGoDaddyCertificateIsPresent () {KeyStore keyStore = loadKeyStore (); Certificaat goDaddyCertificate = keyStore.getCertificate (GODADDY_CA_ALIAS); assertNotNull (goDaddyCertificate); }

6. Conclusie

In dit korte artikel hebben we aan de hand van snelle en praktische voorbeelden gekeken naar verschillende manieren om vertrouwde certificaten in Java weer te geven.

Zoals altijd zijn codefragmenten te vinden op GitHub.

Java onderkant

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS