1

我使用 Android 应用程序生成KeyPair,创建CSR并将其发送到我的CA。在密钥对生成期间,我使用“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 。

4

1 回答 1

0

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

在 Android Keystore 中存储密钥:

 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 检索私钥:

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();
于 2017-08-31T07:41:56.393 回答