java - Android 中央 keystore

标签 java android security certificate android-keystore

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

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

鉴于可用的文档,其他应用开发者似乎在他们的应用中管理他们自己的 keystore ,这似乎是多余的。

有什么想法吗?

最佳答案

这不受支持,可能会在未来的版本中中断等,但这里是获取受信任证书列表的方法。您不能在没有 root 访问权限的情况下添加新的,因为/system 是以只读方式挂载的。但是,如果您确实拥有根访问权限,则可以使用常规的 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);
}

编辑:这应该需要硬编码 keystore 的路径:

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

关于java - Android 中央 keystore ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7002365/

相关文章:

java - 如何使用 ImageIO 获取有关文件压缩的​​信息?

android - 使1个自定义 View 失效导致 View 组中所有自定义 View 失效?

java - 如何获取Android手机的Radio类型(GSM,CDMA,WCDMA,LTE)

java - 浏览器集成ssl证书

java - 了解我是否使用过接口(interface)、抽象、重载和重写

java - 如何解决 jpa 和 hibernate 一对一注释与 doSecondPass 异常

java - 如何在运行时确定所有可用的 ResourceBundle?

android - Libstreaming 错误(解码器缓冲区不够大,解码器没有解码任何东西)

c# - 我应该选择 : This is a full trust application

ruby - $SAFE >= 1 的 ruby​​ 中可能存在哪些漏洞?