Как импортировать закрытый ключ RSA, сгенерированный openssl, в AndroidKeyStore

Я хотел бы импортировать в AndroidKeyStore ключ. Итак, я могу сгенерировать его с помощью openssl следующим образом

openssl rsa -text -in privateKey2048.pem

openssl pkcs8 -topk8 -информ PEM -in ./privateKey2048.pem -outform DER -out private2048.der -nocrypt

затем я могу конвертировать его из private2048.der в шестнадцатеричный формат, который можно конвертировать в byteArray в приложении для Android. Но мне не понятно, как импортировать этот byteArray в AndroidKeyStore?

Итак, в общем, мой вопрос, как импортировать в KeyStore ключ, который существует как String или byteArray?

PS: я знаю, что можно генерировать keyPair с помощью keyPairGenerator.generateKeyPair(), но я хотел бы импортировать мой ключ, например, сгенерированный openssl, а затем жестко запрограммированный в приложении.

1 ответ

Не очень хорошая идея жестко закодировать закрытый ключ в ваше приложение. Этот ключ скомпрометирован, потому что содержимое вашего APK не является секретным и, следовательно, ключ может быть извлечен из APK. Если вы все еще верите, что вам нужно сделать это, несмотря на это предупреждение, читайте дальше.

Чтобы импортировать закрытый ключ в Android Keystore, вам нужно представить его как экземпляр PrivateKey, а затем вам также понадобится сертификат X.509 (для открытого ключа, соответствующего закрытому ключу), представленный как экземпляр X509Certificate. Это связано с тем, что абстракция JCA KeyStore не поддерживает хранение закрытых ключей без сертификата.

Чтобы преобразовать закрытый ключ DER в PKCS#8 в PrivateKey:

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

Чтобы преобразовать закодированный сертификат PEM или DER в сертификат:

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

Наконец, чтобы импортировать закрытый ключ и сертификат в запись myKeyAlias ​​Android Keystore:

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.

Другие вопросы по тегам