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