拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 获取Java可信证书列表

获取Java可信证书列表

白鹭 - 2021-11-24 542 0 0

1.概述

在本快速教程中,我们将通过快速而实际的示例学习如何读取Java中受信任证书的列表。

2.加载KeyStore

Java将受信任的证书存储在一个名为cacerts的特殊文件中,该文件位于我们的Java安装文件夹中。

让我们从读取此文件并将其加载到KeyStore

private KeyStore loadKeyStore() {

 String relativeCacertsPath = "/lib/security/cacerts".replace("/", File.separator);

 String filename = System.getProperty("java.home") + relativeCacertsPath;

 FileInputStream is = new FileInputStream(filename);



 KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());

 String password = "changeit";

 keystore.load(is, password.toCharArray());



 return keystore;

 }

KeyStore的默认密码为“changeit” ,但如果先前在我们的系统中进行了更改,则可能会有所不同。

加载后, KeyStore将保存我们的受信任证书,接下来,我们将了解如何读取它们。

3.从指定的KeyStore

我们将使用[PKIXParameters](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/security/cert/PKIXParameters.html)类,该类将KeyStore作为构造函数参数:

@Test

 public void whenLoadingCacertsKeyStore_thenCertificatesArePresent() {

 KeyStore keyStore = loadKeyStore();

 PKIXParameters params = new PKIXParameters(keyStore);



 Set<TrustAnchor> trustAnchors = params.getTrustAnchors();

 List<Certificate> certificates = trustAnchors.stream()

 .map(TrustAnchor::getTrustedCert)

 .collect(Collectors.toList());



 assertFalse(certificates.isEmpty());

 }

PKIXParameters类通常用于验证证书,但是在我们的示例中,我们仅使用它来从KeyStore提取证书。

当创建一个PKIXParametrs实例时,它将构建一个[TrustAnchor](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/security/cert/TrustAnchor.html)列表,其中将包含存在于我们的KeyStore的受信任证书。

TrustAnchor实例仅表示受信任的证书。

4.从默认KeyStore

我们还可以通过使用TrustManagerFactory KeyStore的情况下对其进行初始化来获取系统中存在的受信任证书的列表,该KeyStore将使用默认的KeyStore

如果我们未KeyStore ,则默认情况下将使用上一章中的相同内容:

@Test

 public void whenLoadingDefaultKeyStore_thenCertificatesArePresent() {

 TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

 trustManagerFactory.init((KeyStore) null);



 List<TrustManager> trustManagers = Arrays.asList(trustManagerFactory.getTrustManagers());

 List<X509Certificate> certificates = trustManagers.stream()

 .filter(X509TrustManager.class::isInstance)

 .map(X509TrustManager.class::cast)

 .map(trustManager -> Arrays.asList(trustManager.getAcceptedIssuers()))

 .flatMap(Collection::stream)

 .collect(Collectors.toList());



 assertFalse(certificates.isEmpty());

 }

在上面的示例中,我们使用了X509TrustManager ,它是专用的TrustManager用于对SSL连接的远程部分进行身份验证。

请注意,此行为可能取决于特定的JDK实现,因为规范init() KeyStore参数为null情况下应该发生的情况。

5.证书别名

证书别名只是一个唯一标识证书String

在Java导入的默认证书中,还有由公共Internet域注册商GoDaddy发行的著名证书,我们将在测试中使用该证书:

String GODADDY_CA_ALIAS = "godaddyrootg2ca [jdk]";

让我们看看如何读取KeyStore存在的所有证书别名:

@Test

 public void whenLoadingKeyStore_thenGoDaddyCALabelIsPresent() {

 KeyStore keyStore = loadKeyStore();



 Enumeration<String> aliasEnumeration = keyStore.aliases();

 List<String> aliases = Collections.list(aliasEnumeration);

 assertTrue(aliases.contains(GODADDY_CA_ALIAS));

 }

在下一个示例中,我们将看到如何通过其别名检索证书:

@Test

 public void whenLoadingKeyStore_thenGoDaddyCertificateIsPresent() {

 KeyStore keyStore = loadKeyStore();



 Certificate goDaddyCertificate = keyStore.getCertificate(GODADDY_CA_ALIAS);

 assertNotNull(goDaddyCertificate);

 }

六,结论

在这篇快速文章中,我们通过快速而实际的示例研究了在Java中列出受信任证书的不同方法。

与往常一样,可以在GitHub上找到代码段。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *