2017-08-28 17 views
1

にAndroidKeyStoreエントリをインストールします。鍵ペアの生成時に、私は「AndroidKeyStore」を使用します。は、私は、<strong>キーペア</strong>を生成<strong>CSR</strong>を作成し、私の<strong>CA</strong>に送信するAndroidアプリケーションを使用AndroidCAStore

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA","AndroidKeyStore"); 
     keyPairGenerator.initialize(new KeyGenParameterSpec.Builder(
       alias, 
       KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY) 
       .setKeySize(KEY_PAIR_LENGTH) 
       .setDigests(KeyProperties.DIGEST_SHA256) 
       .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PSS) 
       .build()); 
     return keyPairGenerator.generateKeyPair(); 

のでPrivateKeyのが生成され、キーストア内に格納されています。私は私のCAからのX509Certificate(CSRに署名した)を取得する場合

私はキーチェーンAPIを使用してのPrivateKeyと証明書をインストールしたいと思います:

PKCS12 = ?! 
Intent intent = createInstallIntent(); 
intent.putExtra(KeyChain.EXTRA_PKCS12, PKCS12); 

はそのような状況でAndroidKeyStoreを使用することが可能ですか?私はからAndroidKeyStoreにPrivateKeyを取得することは不可能だと読んでいます。

+0

キーの素材をAndroidキーストアから抽出することはできません。 Android Keychainに証明書をインストールするためにPkcs12が必要な場合は、アプリのプライベートキーストアを使用する必要があります – pedrofb

+0

別のキーストアを作成してKeyChain APIで使用することをお勧めしますか?キーストア内で秘密鍵を生成することは可能ですか?私はそれをAndroidKeyStoreだけで管理しました。 –

+0

'KeyPairGenerator'を使って公開鍵と秘密鍵のペアを直接生成することができます。鍵と認証チェーンは後で 'KeyStore'に格納し、PKS12として直列化することができます。同様の例がhttps://stackoverflow.com/questions/13207378/saving-certificate-chain-in-a-pkcs12-keystoreにあります。 – pedrofb

答えて

0
I too had similar requirement where in I had to retrieve the Private Key from the Keystore and I was getting the same error as yours. However, after that I tried not using KeyGenParameterSpec while storing the key in Android keystore and it worked for me. 
Check my code below , it might help you 

<pre> 
*** Storing Key in Android Keystore :*** 

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); 
       keyPairGenerator.initialize(2048); 
       KeyPair keyPair = keyPairGenerator.generateKeyPair(); 
       PrivateKey privateKey = keyPair.getPrivate(); 
       keyStore.load(null); 
       X509Certificate certificate = generateCertificate(keyPair, null); 
       Certificate[] certChain = new Certificate[1]; 
       certChain[0] = certificate; 
       keyStore.setKeyEntry(Constants.KEY_ALIAS, privateKey, null, certChain); 


Here X509Certificate is my self signed certificate which I am generating using X509V3CertificateGenerator. 

<pre> 

***Retrieving Private Key from Keystore :*** 

    KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); 

     ks.load(null); 
     KeyStore.Entry entry = ks.getEntry(Constants.KEY_ALIAS, null); 

     if (entry == null) { 
      Logger.w(getClass().getName(), "No key found under alias: " + Constants.KEY_ALIAS); 
      Log.w(getClass().getName(), "Exiting signData()..."); 
      return null; 
     } 


     if (!(entry instanceof KeyStore.PrivateKeyEntry)) { 
      Log.w(getClass().getName(), "Not an instance of a PrivateKeyEntry"); 
      Log.w(getClass().getName(), "Exiting signData()..."); 
      return null; 
     } 

     PrivateKey privateKey = ((KeyStore.PrivateKeyEntry) entry).getPrivateKey(); 
+0

はい、それは私が別のテーマで見つけた最良のオプションです。この状況でできること:1. AndroidKeyStoreではなくousideでKeyPairを生成する。 2.キーストアを作成します。たとえば、PKCS12キーストアなどです。 3.自己署名証明書を作成します。 4. keyEntryをキーストアに設定します。 5. CAから実際の証明書を取得し、KeyEntryを再度設定します。 5. PKCS12をバイト[] /ストリームに変換します。6.証明書をインストールします。 –

+0

はい仲間です。 Upvote /あなたが右感じる場合、答えを受け入れる:) –

関連する問題

 関連する問題