安卓中央密钥库

9
我希望有一种以编程方式访问Android设备上的中央受信任密钥库的方法。 我知道至少存在一个用于验证SSL连接等的密钥库,它还配有一个方便的工具,可用于添加证书、浏览等(在设置 -> 位置和安全性 -> 管理受信任证书下找到)。
我希望能够以编程方式从其中检索公钥,以便加密文件等。根据可用文档,其他应用程序开发人员好像正在其应用程序内管理自己的密钥库,这似乎是多余的。您有什么想法吗?

你会找到服务器证书,这对你已经概述的目的非常有用。你不会发现 - 也不想添加,我想 - 个人证书对于文件加密并不实用,这是你所述的目的。 - Earl
它们似乎只是CA证书。我仍然很想知道它们是否可以通过编程方式访问/修改,以及是否存在用于电子邮件证书等的另一个中央密钥库。 - Nick
你可以访问信任存储并加载它,但是没有官方的API可用。这是一个常规的Bouncy Castle密钥库,你可以简单地使用KeyStore类。 - Nikolay Elenkov
顺便问一下,您在哪个设备/版本上看到“管理受信任的证书”菜单?它不在官方的Android构建中(至少不在Gingerbread中)。 - Nikolay Elenkov
谢谢Nikolay!我想那应该是这样,只是我不知道路径是什么,或者它是否可以被外部应用程序访问。关于设备/版本,我正在使用带有AT&T 2.3版本的Atrix。听到它不是核心构建的一部分,我感到很惊讶。有趣... - Nick
2个回答

9

以下是获取受信任证书列表的方法,但此方法不被支持且可能在未来版本中停用。由于/system被挂载为只读,您无法添加新证书,除非拥有root权限。但如果您确实拥有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);
}

当然,它确实出了问题...至少在升级到4.x的Motorola XOOM平板电脑上;/etc/security/cacerts.bks被替换为包含单个PEM编码文件证书的目录/etc/security/cacerts/。 - Nick
3
您可以通过 API 在 ICS 中添加证书。 我甚至写了一篇关于此的文章 :) http://nelenkov.blogspot.com/2011/12/ics-trust-store-implementation.html - Nikolay Elenkov
这里显示了一个错误:“文件未找到异常”.. 针对此问题应该怎么做? - Shani Goriwal

3

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 = keyAliases.nextElement();
    X509Certificate cert = (X509Certificate) keyStore.getCertificate(alias);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接