我希望有一种方法可以通过编程访问Android设备上的中央可信密钥库。我知道有一个存在,至少用于验证SSL连接等,这也附带一个方便的工具来添加证书,浏览等(在设置 - >位置&安全 - >管理可信证书)Android中央密钥库
我会喜欢能够以编程方式从中检索公钥以用于加密文件等。
鉴于可用文档,似乎其他应用程序开发人员在其应用程序内管理自己的密钥存储区,这似乎是多余的。
任何想法?
我希望有一种方法可以通过编程访问Android设备上的中央可信密钥库。我知道有一个存在,至少用于验证SSL连接等,这也附带一个方便的工具来添加证书,浏览等(在设置 - >位置&安全 - >管理可信证书)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);
}
编辑:这应该与需要的路径硬编码到密钥库工作:
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);
}
当然,它确实打破了......至少在摩托罗拉XOOM平板电脑升级到4.x; /etc/security/cacerts.bks被替换为目录/ etc/security/cacerts /包含证书作为单独的PEM编码文件。 – Nick
您可以通过API在ICS中添加证书。我甚至写了它:) http://nelenkov.blogspot.com/2011/12/ics-trust-store-implementation.html –
这显示错误“文件未找到异常”..该怎么办? –
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>
}
您会发现服务器证书对于您已经列出的目的很有用。你不会发现 - 也不想添加,我认为 - 是用于文件加密的个人证书,以及你陈述的目的。 – Earl
他们似乎只是CA证书。我仍然有兴趣查明它们是否可以通过编程方式访问/修改,以及是否存在另一个用于电子邮件证书的中央密钥库等。 – Nick
您当然可以访问信任库并加载它,但是没有官方API这个。这是一个普通的Bouncy Castle密钥仓库,您可以简单地使用KeyStore类。 –