Obtenir une liste des certificats approuvés en Java

Haut Java

Je viens d'annoncer le nouveau cours Learn Spring , axé sur les principes de base de Spring 5 et Spring Boot 2:

>> VOIR LE COURS

1. Vue d'ensemble

Dans ce tutoriel rapide, nous allons apprendre à lire une liste de certificats de confiance en Java grâce à des exemples rapides et pratiques.

2. Chargement du KeyStore

Java stocke les certificats de confiance dans un fichier spécial nommé cacerts qui se trouve dans notre dossier d'installation Java.

Commençons par lire ce fichier et le charger dans le 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; }

Le mot de passe par défaut de ce KeyStore est «changeit» , mais il pourrait être différent s'il avait été précédemment modifié dans notre système.

Une fois chargé, le KeyStore contiendra nos certificats de confiance, et ensuite, nous verrons comment les lire.

3. Lecture de certificats à partir d'un KeyStore spécifié

Nous allons utiliser la classe PKIXParameters , qui prend un KeyStore comme paramètre de constructeur:

@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 est généralement utilisée pour valider un certificat, mais dans notre exemple, nous l'avons simplement utilisée pour extraire les certificats de notre KeyStore .

Lors de la création d'une instance de PKIXParametrs , il construit une liste de TrustAnchor qui contiendra les certificats de confiance présents dans notre KeyStore .

Une instance TrustAnchor représente simplement un certificat de confiance.

4. Lecture des certificats à partir du KeyStore par défaut

Nous pouvons également obtenir une liste des certificats de confiance présents dans notre système en utilisant la classe TrustManagerFactory et en l'initialisant sans KeyStore , qui utilisera le KeyStore par défaut .

Si nous ne fournissons pas explicitement un KeyStore , le même du chapitre précédent sera utilisé par défaut:

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

Dans l'exemple ci-dessus, nous avons utilisé X509TrustManager , qui est un TrustManager spécialisé utilisé pour authentifier la partie distante d'une connexion SSL.

Notez que ce comportement peut dépendre de l'implémentation JDK spécifique, car la spécification ne définit pas ce qui doit se passer si le paramètre init () KeyStore est nul .

5. Alias ​​de certificat

Un alias de certificat est simplement une chaîne qui identifie de manière unique un certificat.

Parmi les certificats par défaut importés par Java, il y a aussi un certificat bien connu émis par GoDaddy, un registraire de domaine Internet public, que nous utiliserons dans nos tests:

String GODADDY_CA_ALIAS = "godaddyrootg2ca [jdk]";

Voyons comment nous pouvons lire tous les alias de certificat présents dans notre KeyStore :

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

Dans l'exemple suivant, nous verrons comment nous pouvons récupérer un certificat par son alias:

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

6. Conclusion

Dans cet article rapide, nous avons examiné différentes façons de répertorier les certificats de confiance en Java grâce à des exemples rapides et pratiques.

Comme toujours, des extraits de code peuvent être trouvés sur GitHub.

Fond Java

Je viens d'annoncer le nouveau cours Learn Spring , axé sur les principes de base de Spring 5 et Spring Boot 2:

>> VOIR LE COURS