将AndroidKeyStore条目安装到AndroidCAStore

时间:2017-08-28 05:34:34

标签: android rsa android-keystore java-security spongycastle

我使用Android应用生成 KeyPair ,创建 CSR 并将其发送到我的 CA 。在keyPair生成期间,我使用" AndroidKeyStore"

 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA","AndroidKeyStore");
        keyPairGenerator.initialize(new KeyGenParameterSpec.Builder(
                alias,
                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
                .setKeySize(KEY_PAIR_LENGTH)
                .setDigests(KeyProperties.DIGEST_SHA256)
                .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PSS)
                .build());
        return keyPairGenerator.generateKeyPair();

所以PrivateKey被生成并存储在KeyStore中。

当我从我的CA获得X509Certificate(已签名的CSR)时,我想使用KeyChain API安装PrivateKey和证书:

PKCS12 = ?!
Intent intent = createInstallIntent();
intent.putExtra(KeyChain.EXTRA_PKCS12, PKCS12);

在那种情况下可以使用 AndroidKeyStore 吗?我读过从 AndroidKeyStore 获取PrivateKey是不可能的。

1 个答案:

答案 0 :(得分:0)

我也有类似的要求,我必须从Keystore检索私钥,我得到的错误与你的相同。但是,之后我尝试在Android密钥库中存储密钥时不使用KeyGenParameterSpec,它对我有用。     检查下面的代码,它可能对你有帮助

在Android密钥库中存储密钥:

 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
 keyPairGenerator.initialize(2048);
 KeyPair keyPair = keyPairGenerator.generateKeyPair();
 PrivateKey privateKey = keyPair.getPrivate();
 keyStore.load(null);

 X509Certificate certificate = generateCertificate(keyPair, null);
 Certificate[] certChain = new Certificate[1];
 certChain[0] = certificate;

 keyStore.setKeyEntry(Constants.KEY_ALIAS, privateKey, null, certChain);

此处X509Certificate是我使用X509V3CertificateGenerator生成的自签名证书。

从密钥库中检索私钥:

KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
KeyStore.Entry entry = ks.getEntry(Constants.KEY_ALIAS, null);

if (entry == null) {
    Logger.w(getClass().getName(), "No key found under alias: " + Constants.KEY_ALIAS);
    Log.w(getClass().getName(), "Exiting signData()...");
    return null;
}

if (!(entry instanceof KeyStore.PrivateKeyEntry)) {
    Log.w(getClass().getName(), "Not an instance of a PrivateKeyEntry");
    Log.w(getClass().getName(), "Exiting signData()...");
    return null;
}

PrivateKey privateKey = ((KeyStore.PrivateKeyEntry) entry).getPrivateKey();