【问题标题】:How to retrieve installed X509 certificate from Android keychain?如何从 Android 钥匙串中检索已安装的 X509 证书?
【发布时间】:2018-09-05 22:27:46
【问题描述】:

我使用以下代码在 andorid 钥匙串中安装了 X509 证书:

        Intent installIntent = KeyChain.createInstallIntent();
        installIntent.putExtra(KeyChain.EXTRA_NAME, "My certificate");
        installIntent.putExtra(KeyChain.EXTRA_CERTIFICATE, certificate.getEncoded());
        startActivityForResult(installIntent, 2);

我收到一个提到“我的证书已安装”的祝酒词。现在,当我尝试使用以下代码取回它时:

 try {
        KeyStore ks = KeyStore.getInstance("AndroidCAStore");
        if (ks != null) {
            ks.load(null, null);
            Enumeration aliases = ks.aliases();
            List<String> alliasesNames = Collections.list(aliases);
            for (String name : alliasesNames) {
                if (ks.getCertificate(name) instanceof X509Certificate) {
                    X509Certificate certificate = (X509Certificate) ks.getCertificate(name);
                    if (certificate.getIssuerDN().getName().contains("My Certificate")) {
                        Log.d("CERTEXIST", "**********User Cert " + certificate.getIssuerDN().getName());
                    }
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (KeyStoreException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (java.security.cert.CertificateException e) {
        e.printStackTrace();
    }

我无法在其中找到已安装的 x509。我还可以在设备的安全设置中的用户证书中看到已安装的 x509 证书。

另外,当我提示用户为服务器通信选择证书时,使用:

        KeyChain.choosePrivateKeyAlias(loginActivity, this,
            new String[]{}, null, null, -1, null);
    }

提示未显示我的证书。我是 Android 中这个证书和密钥链的新手。

我想知道如何检索保存的 x509 证书并提示用户选择该证书。

感谢任何帮助。

【问题讨论】:

    标签: android x509certificate keychain


    【解决方案1】:

    KeyChain.choosePrivateKeyAlias 启动活动提示用户选择私钥的别名,但您安装了证书,而不是私钥,因此您的证书将不存在。 p>

    KeyChain.createInstallIntent() 可用于安装 X509 证书或 PKCS#12 文件,包含私钥和证书。如果需要安装私钥+证书进行认证,需要提供p12文件。

    byte pkcs12Data[] = ...
    installIntent.putExtra(KeyChain._PKCS12, pkcs12Data);
    

    【讨论】:

    • 感谢您的回复@pedrofb。我也是这么理解的。我有一个 PKCS12 文件(pfx),并且在通过 KeyChain._PKCS12 安装它时;它要求用户输入密码。在我的情况下,用户不知道密码。我们通过代码生成它。因此,将该 PCKS12 文件加载到密钥库并提取其证书链并从该证书链安装 509 证书。
    • 如果我不应该要求用户输入我的 .pfx 文件安装的密码,我该怎么办?我有通过代码生成的密码。我可以至少在提示符中填充该密码吗(可能是通过意图传递密码)?或者有没有办法从该 pfx 文件中删除密码。
    • 或者我应该将该 pfx 文件转换为任何其他格式,该格式仍可用于无密码的 pem 之类的目的,并允许用户安装它?我完全糊涂了,无法选择需要做什么?请帮忙!
    • 用户必须输入密码。这是设计使然,以防止恶意代理在用户不知情的情况下安装私钥,这可能导致例如中间人攻击。 KeyChain 只接受 pkcs12 格式的私钥,p12 文件需要密码(加密内容)。您可以尝试空密码“”,让用户直接点击确定按钮,但我不知道这是否有效。见stackoverflow.com/questions/27497723/…
    • i_t实际上是否意味着cA证书将被添加到所有后续HTTP请求中,不,您需要配置SSL上下文以使用KeyChain作为密钥库。您不能直接将密钥提供给SSLContext,因为 KeyChain 密钥不可提取,因此您需要一个 X509TrustManager 适配器(可能 Volley 直接支持它)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 2011-07-12
    • 2017-06-03
    • 1970-01-01
    • 2011-07-16
    • 2011-06-20
    • 1970-01-01
    相关资源
    最近更新 更多