¿Cómo puedo obtener una lista de certificados raíz de confianza en Java?

Me gustaría poder acceder a todos los certificados raíz de confianza mediante progtwigción en una aplicación Java.

Estaba mirando la interfaz del almacén de claves, pero espero obtener la lista de raíces de confianza que está implícita con el JRE.

¿Es accesible en cualquier lugar?

Hay un ejemplo que muestra cómo obtener un conjunto de certificados raíz e iterar a través de ellos. Enumerar las autoridades de certificación (CA) de mayor confianza en un almacén de claves . Aquí hay una versión ligeramente modificada que imprime cada certificado (probado en 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) { } } } 

Esto debería ser más flexible utilizando el almacén de confianza predeterminado en el sistema para obtener todos los certificados:

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

“ `