测试平台为Motorola G5,运行8.1.0;BouncyCastle 1.56
我正在尝试将客户端证书与AndroidKeyStore一起使用。
使用KeyPairgenerator和KeyPairGeneratorSpec,我可以创建CN为“temporary”的自签名密钥对;在后台,库将其存储在AndroidKeyStore中,并使用KPGS. Builder的别名。
我后来getEntry()并得到了一个KeyStore.PrivateKeyEntry。
我从中提取密钥数据,并将其传递给bouncy castle CertificationRequest类,我将证书传递给我的公司CA,他们向我发送一个证书链(附加了两个X509密钥;一个用于我创建的DN,以及他们的自签名证书)
(用openssl x509把证书拆开...没有什么意外)
在此之前,一切都如文件所示。
奇怪的是……
文档中顺便提到,您可以“稍后将自签名证书替换为'真实的的证书'”,我用以下代码做到了这一点:
KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(mykey,null);
KeyStore.PrivateKeyEntry replacement = new KeyStore.PrivateKeyEntry(entry.getPrivateKey(),
certs);
keyStore.setEntry(mykey,replacement,null);
KeyStore.Entry nowItIs = keyStore.getEntry(mykey,null);
Log.v(TAG, String.format("After storing, the key is now a %s",
nowItIs.getClass().getSimpleName()));
这就是神秘的转变:从理论上讲,nowItIs应该等同于replacement...但它不是:它是一个TrustedCertificateEntry。
几年前也有人提出过同样的问题,但没有解决办法。
2条答案
按热度按时间wsewodh21#
我在使用模拟器和其他一些设备时也遇到了同样的问题。唯一有帮助的方法是使用PKCS12 KeyStore(作为文件)而不是AndroidKeyStore。
x8diyxa72#
我试过了,也发生了同样的问题。我按照以下步骤成功了。
1.创建一个不使用Android密钥库的自签名密钥对。密钥对仅保留在内存中。
1.使用密钥对创建CSR。
1.创建由CA签名的证书。
1.将私钥和证书签名对同时保存到Android密钥库
keyStore.setEntry(keyPairAlias,KeyStore.PrivateKeyEntry(keypair.private,arrayOf(x509Certificate)),null)