如何将由openssl生成的RSA私钥导入AndroidKeyStore

时间:2016-04-22 13:00:52

标签: android openssl keystore

我想导入AndroidKeyStore一键。 所以,我可以通过openssl以下面的方式生成它

  

openssl rsa -text -in privateKey2048.pem

     

openssl pkcs8 -topk8 -inform PEM -in ./privateKey2048.pem -outform DER -out   private2048.der -nocrypt

然后我可以将它从private2048.der转换为十六进制格式,可以在android app中的byteArray中转换。但它对我来说并不清楚, 如何将这个byteArray导入AndroidKeyStore?

所以一般来说,我的问题是如何导入KeyStore键作为String或byteArray存在?

ps:我知道可以通过keyPairGenerator.generateKeyPair()生成keyPair,但是我想导入我的密钥,例如由openssl生成,然后在应用程序中进行硬编码。

1 个答案:

答案 0 :(得分:6)

将私钥硬编码到应用程序中并不是一个好主意。 此密钥已被盗用,因为您的APK内容并非保密,因此可以从APK中提取密钥。如果你仍然认为你需要这样做,尽管有这个警告,请继续阅读。

要将私钥导入Android密钥库,您需要将其表示为PrivateKey实例,然后您还需要一个X.509证书(对应于私钥的公钥),表示为X509Certificate实例。这是因为JCA KeyStore抽象不支持在没有证书的情况下存储私钥。

将PKCS#8 DER编码的私钥转换为PrivateKey:

PrivateKey privateKey =
    KeyFactory.getInstance("RSA").generatePrivate(
        new PKCS8EncodedKeySpec(privateKeyPkcs8));

将PEM或DER编码的证书转换为证书:

Certificate cert =
    CertificateFactory.getInstance("X.509").generateCertificate(
        new ByteArrayInputStream(pemOrDerEncodedCert));

最后,将私钥和证书导入Android Keystore" myKeyAlias"项:

KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
ks.setKeyEntry("myKeyAlias", privateKey, null, new Certificate[] {cert});

请参阅https://developer.android.com/reference/android/security/keystore/KeyProtection.html上的更多高级示例。