獲取Java可信證書列表
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上找到代碼段。