2011-08-09 72 views
9

我希望有一种方法可以通过编程访问Android设备上的中央可信密钥库。我知道有一个存在,至少用于验证SSL连接等,这也附带一个方便的工具来添加证书,浏览等(在设置 - >位置&安全 - >管理可信证书)Android中央密钥库

我会喜欢能够以编程方式从中检索公钥以用于加密文件等。

鉴于可用文档,似乎其他应用程序开发人员在其应用程序内管理自己的密钥存储区,这似乎是多余的。

任何想法?

+0

您会发现服务器证书对于您已经列出的目的很有用。你不会发现 - 也不想添加,我认为 - 是用于文件加密的个人证书,以及你陈述的目的。 – Earl

+0

他们似乎只是CA证书。我仍然有兴趣查明它们是否可以通过编程方式访问/修改,以及是否存在另一个用于电子邮件证书的中央密钥库等。 – Nick

+0

您当然可以访问信任库并加载它,但是没有官方API这个。这是一个普通的Bouncy Castle密钥仓库,您可以简单地使用KeyStore类。 –

回答

9

这不受支持,可能会在未来的版本中崩溃等,但以下是如何获取受信任证书的列表。无法访问root用户不能添加新的用户,因为/ system是以只读方式挂载的。但是,如果你有root权限,你可以使用常规的KeyStore API来添加证书。

KeyStore ks = KeyStore.getInstance("BKS"); 
InputStream is = new FileInputStream("/etc/security/cacerts.bks"); 
ks.load(is, "changeit".toCharArray()); 

List<X509Certificate> certs = new ArrayList<X509Certificate>(); 
Enumeration<String> aliases = ks.aliases(); 
while (aliases.hasMoreElements()) { 
    String alias = aliases.nextElement(); 
    X509Certificate cert = (X509Certificate) ks.getCertificate(alias); 
    certs.add(cert); 
} 

编辑:这应该与需要的路径硬编码到密钥库工作:

TrustManagerFactory tmf = TrustManagerFactory 
        .getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
tmf.init((KeyStore) null); 
X509TrustManager xtm = (X509TrustManager) tmf.getTrustManagers()[0]; 
for (X509Certificate cert : xtm.getAcceptedIssuers()) { 
    String certStr = "S:" + cert.getSubjectDN().getName() + "\nI:" 
         + cert.getIssuerDN().getName(); 
    Log.d(TAG, certStr); 
} 
+0

当然,它确实打破了......至少在摩托罗拉XOOM平板电脑升级到4.x; /etc/security/cacerts.bks被替换为目录/ etc/security/cacerts /包含证书作为单独的PEM编码文件。 – Nick

+3

您可以通过API在ICS中添加证书。我甚至写了它:) http://nelenkov.blogspot.com/2011/12/ics-trust-store-implementation.html –

+0

这显示错误“文件未找到异常”..该怎么办? –

1

ICS(Android 4.0版本/ API 14)推出的TrustedCertificateStore(未在SDK中直接可用)这使你能够做到这一点。您可以使用像这样的JCA Keystore API来访问它:

/** 
* Android Central Keystore repo usually located on /data/misc/keychain 
* including the system trusted anchors located on /system/etc/security 
*/ 
KeyStore keyStore = KetStore.getInstance("AndroidCAStore"); 
keyStore.load(null, null); //Load default system keystore 
Enumeration<String> keyAliases = keyStore.aliases(); 

while(keyAliases.hasMoreElements()){ 
    String alias = aliases.nextElement(); 
    X509Certificate cert = (X509Certificate) keyStore.getCertificate(alias); 

    //<User cert in whatever way you want> 
}