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 评论