9

我希望有一种方法可以以编程方式访问 Android 设备上的中央可信密钥库。我知道存在一个,至少用于验证 SSL 连接等,它还附带一个方便的工具,用于添加证书、浏览等。(在设置->位置和安全->管理受信任的证书下找到)

我希望能够以编程方式从中检索公钥,以加密文件等。

鉴于可用的文档,似乎其他应用程序开发人员正在他们的应用程序中管理自己的密钥库,这似乎是多余的。

有任何想法吗?

4

2 回答 2

9

这不受支持,可能会在未来的版本中中断等,但这里是如何获取受信任证书的列表。没有 root 访问权限就不能添加新的,因为 /system 是只读安装的。但是,如果您确实具有 root 访问权限,则可以使用常规KeyStoreAPI 添加证书。

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);
}
于 2011-08-10T02:31:29.307 回答
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>
}
于 2015-07-11T14:17:50.227 回答