2016-04-22 18 views
6

Chciałbym zaimportować do AndroidKeyStore klucz. Więc mogę wygenerować go przez OpenSSL w następujący sposóbJak zaimportować klucz prywatny RSA, który został wygenerowany przez openssl, do AndroidKeyStore

openssl rsa -in -text privateKey2048.pem

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

następnie można przekształcić na format z private2048.der sześciokątnym, który może być przekształcony w tablicaBitowa w androida. Ale nie jest dla mnie jasne, Jak zaimportować ten bajtArray do AndroidKeyStore?

Moje pytanie brzmi: jak zaimportować klucz KeyStore, który istnieje jako ciąg lub byteArray?

ps: Wiem, że można wygenerować keyPair przez keyPairGenerator.generateKeyPair(), ale chciałbym zaimportować mój klucz, na przykład wygenerowany przez openssl, a następnie zakodowany w aplikacji.

+0

Możesz odwołać się do tego posta http://stackoverflow.com/questions/36688119/import-existing-private-key-into-bks-keystore –

Odpowiedz

4

Nie jest dobrym pomysłem zakodowanie klucza prywatnego w aplikacji. Ten klucz jest zagrożony, ponieważ zawartość pliku APK nie jest tajna i dlatego klucz może zostać wyodrębniony z pliku APK. Jeśli nadal uważasz, że musisz to zrobić pomimo tego ostrzeżenia, czytaj dalej.

Aby zaimportować klucz prywatny do magazynu kluczy systemu Android, musisz go reprezentować jako instancję PrivateKey, a także potrzebny jest certyfikat X.509 (dla klucza publicznego odpowiadającego kluczowi prywatnemu) reprezentowanemu jako instancja klasy X509Certificate. Wynika to z faktu, że abstrakcja JCA KeyStore nie obsługuje przechowywania kluczy prywatnych bez certyfikatu.

Aby przekonwertować PKCS # 8 DER zakodowanego klucza prywatnego do PrivateKey:

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

Aby przekonwertować certyfikat PEM lub DER zakodowane w świadectwie:

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

Wreszcie, aby zaimportować prywatny klucz i certyfikat do wpisu "myKeyAlias" w systemie Android Keystore:

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

Zobacz mo ponownie zaawansowane przykłady pod adresem https://developer.android.com/reference/android/security/keystore/KeyProtection.html.

+0

Dziękuję bardzo. ps:> "Nie warto zamykać klucza prywatnego w aplikacji." Tak, wiem, potrzebuję go do celów edukacyjnych. – i716

Powiązane problemy