Android中央密钥库

我希望有一种方法可以在Android设备上以编程方式访问中央可信密钥库。 我知道有一个存在,至less用于validationSSL连接等,这也附带了一个方便的工具,用于添加证书,浏览等(在设置 – >位置和安全 – >pipe理可信证书下find)

我希望能够以编程方式检索公钥从encryption文件等

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

有任何想法吗?

Solutions Collecting From Web of "Android中央密钥库"

这不被支持,可能在未来的版本中打破等,但是这里是如何获得可信证书的列表。 您不能在没有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); } 

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

 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); } 

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> }