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

Sha*_* D. 32 java certificate keystore

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

我正在查看密钥库接口,但我希望得到JRE隐含的可信根列表.

这可以随处访问吗?

Bil*_*ard 38

有一个示例显示如何获取一组根证书并遍历它们,称为列出密钥库中最受信任的证书颁发机构(CA).这是一个略微修改的版本,打印出每个证书(在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) {
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您知道默认密钥库的更好密码吗? (6认同)
  • 这段代码有很大的局限性,IMO.例如,如果使用系统属性(javax.net.ssl.trustStore,javax.net.ssl.trustStorePassword,javax.net.ssl.trustStoreType等)设置默认信任库,那么此代码将最终加载错误的信任商店.此类代码还会在使用NSS(用于FIPS兼容性)等替换默认信任库的环境中引发问题. (3认同)

k_o*_*_o_ 13

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

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()));
                });
Run Code Online (Sandbox Code Playgroud)

```