獲取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上找到代碼段。