2017-08-28 260 views
1

我使用Android应用程序生成密钥对,创建CSR并将其发送给我CA。在密钥对生成我使用“AndroidKeyStore”安装AndroidKeyStore进入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(); 

所以专用密钥产生并存储内部密钥库。

当我得到X509证书(签署CSR)从我的CA我想专用密钥和证书使用钥匙链API来安装:

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

是否有可能使用AndroidKeyStore在这种情况下?我读了它是不可能从获得PrivateKey的AndroidKeyStore

+0

无法从Android密钥库中提取密钥材料。如果您需要Pkcs12在Android钥匙串中安装证书,那么您需要使用应用程序中的私钥库 – 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中生成KeyPair,而是在外侧。 2.创建密钥库 - 例如PKCS12密钥库。 3.制作自签名证书。 4.将keyEntry设置为密钥库。 5.从CA获取真实证书并再次设置KeyEntry。 5.将PKCS12转换为字节[] /流6.安装证书。 –

+0

是的哥们。 Upvote /接受答案,如果你觉得正确:) –