如何在 Java 中获取受信任的根证书列表?

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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

以上是关于如何在 Java 中获取受信任的根证书列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何将该根证书作为受信任的根导入 Azure 应用服务?

iOS 中可用的受信任根证书列表

如何将SSL证书设置成受信任的证书

将证书添加到受信任的根证书存储失败,出现以下错误:访问控制列表(ACL)结构无效

如何获取服务器证书链,然后验证它在 Java 中是不是有效且受信任

. net framework 4.7安装未成功,提示已处理证书链,但是在不受信任程序信任的根证书?