2016-04-22 15 views
6

Vorrei importare in AndroidKeyStore una chiave. Quindi, posso generarlo da OpenSSL in modo seguenteCome importare la chiave privata RSA, generata da openssl, in AndroidKeyStore

openssl rsa -in -text privateKey2048.pem

OpenSSL PKCS8 -topk8 -inform PEM -in ./privateKey2048.pem -outform DER -out private2048.der -nocrypt

allora posso convertire da private2048.der in formato esadecimale, che può essere convertito in ByteArray in applicazione android. Ma non è chiaro per me, Come importare questo byteArray in AndroidKeyStore?

Quindi, in generale, la mia domanda è come importare in chiave KeyStore che esiste come String o byteArray?

ps: So che è possibile generare un keyPair da keyPairGenerator.generateKeyPair(), ma vorrei importare la mia chiave, ad esempio generata da openssl e quindi codificata nell'applicazione.

+0

È possibile fare riferimento a questo post http://stackoverflow.com/questions/36688119/import-existing-private-key-into-bks-keystore –

risposta

4

Non è una buona idea codificare una chiave privata nell'applicazione. Questa chiave è compromessa perché il contenuto dell'APK non è segreto e pertanto la chiave può essere estratta dall'APK. Se continui a credere che sia necessario farlo nonostante questo avviso, continua a leggere.

Per importare la chiave privata nel keystore Android, è necessario rappresentarla come istanza PrivateKey e quindi è necessario anche un certificato X.509 (per la chiave pubblica corrispondente alla chiave privata) rappresentato come un'istanza X509Certificate. Questo perché l'astrazione di JCA KeyStore non supporta l'archiviazione di chiavi private senza un certificato.

Per convertire l'8 DER chiave privata PKCS # codificato in un PrivateKey:

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

Per convertire il certificato PEM o DER codificato in un certificato:

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

Infine, per importare il privato chiave e il cert nella voce "myKeyAlias" di Android Keystore:

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

Vedere re esempi avanzati a https://developer.android.com/reference/android/security/keystore/KeyProtection.html.

+0

Grazie mille. ps:> "Non è una buona idea codificare una chiave privata nella tua applicazione." Sì, lo so, ne ho bisogno per scopi educativi. – i716

Problemi correlati