如何从Android钥匙串中检索已安装的X509证书?

时间:2018-03-27 13:25:30

标签: android x509certificate keychain

我使用以下代码在ororid钥匙串中安装了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证书并提示用户选择该证书。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

KeyChain.choosePrivateKeyAlias启动antivity以提示用户选择私钥的别名,但是您已经安装了证书,而不是私钥,因此您的证书将不在那里

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

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