2010-08-18 173 views

回答

31

在Example Depot中有一個示例,顯示如何獲取一組根證書並遍歷它們,名爲Listing the Most-Trusted Certificate Authorities (CA) in a Key Store。這是一個稍作修改的版本,可打印出每個證書(在Windows Vista上測試)。

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.security.InvalidAlgorithmParameterException; 
import java.security.KeyStore; 
import java.security.KeyStoreException; 
import java.security.NoSuchAlgorithmException; 
import java.security.cert.CertificateException; 
import java.security.cert.PKIXParameters; 
import java.security.cert.TrustAnchor; 
import java.security.cert.X509Certificate; 
import java.util.Iterator; 


public class Main { 

    public static void main(String[] args) { 
     try { 
      // Load the JDK's cacerts keystore file 
      String filename = System.getProperty("java.home") + "/lib/security/cacerts".replace('/', File.separatorChar); 
      FileInputStream is = new FileInputStream(filename); 
      KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); 
      String password = "changeit"; 
      keystore.load(is, password.toCharArray()); 

      // This class retrieves the most-trusted CAs from the keystore 
      PKIXParameters params = new PKIXParameters(keystore); 

      // Get the set of trust anchors, which contain the most-trusted CA certificates 
      Iterator it = params.getTrustAnchors().iterator(); 
      while(it.hasNext()) { 
       TrustAnchor ta = (TrustAnchor)it.next(); 
       // Get certificate 
       X509Certificate cert = ta.getTrustedCert(); 
       System.out.println(cert); 
      } 
     } catch (CertificateException e) { 
     } catch (KeyStoreException e) { 
     } catch (NoSuchAlgorithmException e) { 
     } catch (InvalidAlgorithmParameterException e) { 
     } catch (IOException e) { 
     } 
    } 
} 
+1

好吧,我會嘗試了這一點。 (時間流逝) 它工作。你知道,令人遺憾的是,默認keystore的密碼確實是'changeit'。 謝謝。 – 2010-08-18 03:25:21

+5

你知道默認密鑰庫更好的密碼嗎? – 2010-08-18 03:56:12

+0

有沒有辦法改變默認密碼? – 2011-05-13 17:14:17

3

這應該使用系統默認的信任存儲來獲取所有證書更靈活:

TrustManagerFactory trustManagerFactory = 
    TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
List<Certificate> x509Certificates = new ArrayList<>(); 
trustManagerFactory.init((KeyStore)null);     
Arrays.asList(trustManagerFactory.getTrustManagers()).stream().forEach(t -> { 
        x509Certificates.addAll(Arrays.asList(((X509TrustManager)t).getAcceptedIssuers())); 
       }); 

```

+0

需要Android N – estoke 2017-03-08 15:15:42

相關問題