【问题标题】:How can I get a list of trusted root certificates in Java?如何在 Java 中获取受信任的根证书列表?
【发布时间】:2011-03-31 07:11:03
【问题描述】:

我希望能够在 Java 应用程序中以编程方式访问所有受信任的根证书。

我正在查看密钥库接口,但我希望获得 JRE 隐含的受信任根列表。

这可以在任何地方访问吗?

【问题讨论】:

    标签: java certificate keystore


    【解决方案1】:

    有一个示例显示了如何获取一组根证书并遍历它们,称为Listing the Most-Trusted Certificate Authorities (CA) in a Key Store。这是一个稍微修改的版本,可以打印出每个证书(在 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) {
            } 
        }
    }
    

    【讨论】:

    • 好的,我会试试这个。 (时间流逝)它奏效了。你知道,可悲的是默认密钥库的密码确实是“changeit”。谢谢。
    • 您知道默认密钥库的更好密码吗?
    • @jaime:您可以使用 keytool 更改它。 sslshopper.com/…
    • 这个代码有很大的限制,IMO。例如,如果使用系统属性(javax.net.ssl.trustStore、javax.net.ssl.trustStorePassword、javax.net.ssl.trustStoreType 等)设置默认信任库,则此代码将最终加载错误的信任店铺。这种类型的代码还会在默认信任库已被 NSS(为了 FIPS 合规性)之类的东西替换的环境中引起问题。
    • @Bill - “此类从密钥库中检索最受信任的 CA” - 请原谅我的无知...“最受信任”是什么意思?
    【解决方案2】:

    这应该更灵活,使用系统中的默认信任库来获取所有证书:

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

    ```

    【讨论】:

    • 需要 Android N
    猜你喜欢
    • 2019-02-26
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多