web-dev-qa-db-fra.com

Comment obtenir une liste des certificats racine de confiance en Java?

J'aimerais pouvoir accéder à tous les certificats racine de confiance par programmation dans une application Java.

Je regardais l'interface du magasin de clés, mais j'espère obtenir la liste des racines de confiance implicites avec le JRE.

Est-ce accessible partout?

32
Shawn D.

Il y a un exemple qui montre comment obtenir un ensemble de certificats racine et les parcourir en les appelant Liste des autorités de certification les plus fiables (CA) dans un magasin de clés . Voici une version légèrement modifiée qui imprime chaque certificat (testé sur Windows Vista).

import Java.io.File;
import Java.io.FileInputStream;
import Java.io.IOException;
import Java.security.InvalidAlgorithmParameterException;
import Java.security.KeyStore;
import Java.security.KeyStoreException;
import Java.security.NoSuchAlgorithmException;
import Java.security.cert.CertificateException;
import Java.security.cert.PKIXParameters;
import Java.security.cert.TrustAnchor;
import Java.security.cert.X509Certificate;
import Java.util.Iterator;


public class Main {

    public static void main(String[] args) {
        try {
            // Load the JDK's cacerts keystore file
            String filename = System.getProperty("Java.home") + "/lib/security/cacerts".replace('/', File.separatorChar);
            FileInputStream is = new FileInputStream(filename);
            KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
            String password = "changeit";
            keystore.load(is, password.toCharArray());

            // This class retrieves the most-trusted CAs from the keystore
            PKIXParameters params = new PKIXParameters(keystore);

            // Get the set of trust anchors, which contain the most-trusted CA certificates
            Iterator it = params.getTrustAnchors().iterator();
            while( it.hasNext() ) {
                TrustAnchor ta = (TrustAnchor)it.next();
                // Get certificate
                X509Certificate cert = ta.getTrustedCert();
                System.out.println(cert);
            }
        } catch (CertificateException e) {
        } catch (KeyStoreException e) {
        } catch (NoSuchAlgorithmException e) {
        } catch (InvalidAlgorithmParameterException e) {
        } catch (IOException e) {
        } 
    }
}
36
Bill the Lizard

Cela devrait être plus flexible en utilisant le magasin d'approbations par défaut du système pour obtenir tous les certificats:

TrustManagerFactory trustManagerFactory =
   TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
List<Certificate> x509Certificates = new ArrayList<>();
trustManagerFactory.init((KeyStore)null);                 
Arrays.asList(trustManagerFactory.getTrustManagers()).stream().forEach(t -> {
                    x509Certificates.addAll(Arrays.asList(((X509TrustManager)t).getAcceptedIssuers()));
                });

`` ''

12
k_o_