2010-08-18 91 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

相关问题