我使用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是不可能的。
答案 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();