Ottieni un elenco di certificati attendibili in Java

Java Top

Ho appena annunciato il nuovo corso Learn Spring , incentrato sui fondamenti di Spring 5 e Spring Boot 2:

>> SCOPRI IL CORSO

1. Panoramica

In questo breve tutorial, impareremo come leggere un elenco di certificati affidabili in Java attraverso esempi rapidi e pratici.

2. Caricamento del KeyStore

Java memorizza i certificati attendibili in un file speciale denominato cacerts che risiede nella nostra cartella di installazione di Java.

Iniziamo leggendo questo file e caricandolo nel 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; }

La password predefinita per questo KeyStore è "changeit" , ma potrebbe essere diversa se fosse stata precedentemente modificata nel nostro sistema.

Una volta caricato, il KeyStore manterrà i nostri certificati attendibili e successivamente vedremo come leggerli.

3. Lettura di certificati da un archivio chiavi specificato

Utilizzeremo la classe PKIXParameters , che accetta un KeyStore come parametro del costruttore:

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

La classe PKIXParameters viene solitamente utilizzata per convalidare un certificato, ma nel nostro esempio l'abbiamo semplicemente utilizzata per esigere i certificati dal nostro KeyStore .

Quando si crea un'istanza di PKIXParametrs , crea un elenco di TrustAnchor che conterrà i certificati attendibili presenti nel nostro KeyStore .

Un TrustAnchor esempio rappresenta semplicemente un certificato attendibile.

4. Lettura dei certificati da KeyStore predefinito

Possiamo anche ottenere un elenco dei certificati attendibili presenti nel nostro sistema utilizzando la classe TrustManagerFactory e inizializzandola senza un KeyStore , che utilizzerà il KeyStore predefinito .

Se non forniamo un KeyStore esplicitamente, verrà utilizzato di default lo stesso del capitolo precedente:

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

Nell'esempio precedente, abbiamo utilizzato X509TrustManager , che è un TrustManager specializzato utilizzato per autenticare la parte remota di una connessione SSL.

Si noti che questo comportamento può dipendere dalla specifica implementazione JDK, poiché la specifica non definisce cosa dovrebbe accadere nel caso in cui il parametro init () KeyStore sia null .

5. Alias ​​di certificato

Un alias di certificato è semplicemente una stringa che identifica un certificato in modo univoco.

Tra i certificati predefiniti importati da Java, c'è anche un noto certificato emesso da GoDaddy, un registrar di domini Internet pubblici, che utilizzeremo nei nostri test:

String GODADDY_CA_ALIAS = "godaddyrootg2ca [jdk]";

Vediamo come possiamo leggere tutti gli alias di certificato presenti nel nostro KeyStore :

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

Nel prossimo esempio, vedremo come recuperare un certificato tramite il suo alias:

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

6. Conclusione

In questo breve articolo, abbiamo esaminato diversi modi per elencare i certificati affidabili in Java attraverso esempi rapidi e pratici.

Come sempre, gli snippet di codice possono essere trovati su GitHub.

Fondo Java

Ho appena annunciato il nuovo corso Learn Spring , incentrato sui fondamenti di Spring 5 e Spring Boot 2:

>> SCOPRI IL CORSO