2014-10-03 11 views
0

Я новичок в использовании хранилищ ключей, есть ли способ создать хранилище ключей, когда у меня есть файл cert и закрытый ключ в формате pem? Пожалуйста, помогитеИмпортировать закрытый ключ из файла pem в хранилище ключей

keyStore = KeyStore.getInstance("PKCS12"); 

    keyStore.load(null, pwd.toCharArray()); 

    String privKeyPEM= privateKey.replace("-----BEGIN RSA PRIVATE KEY-----\r\n",""); 
    privKeyPEM = privKeyPEM.replace("\r\n-----END RSA PRIVATE KEY-----",""); 
    byte [] encoded = Base64.decode(privKeyPEM); 
    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded); 
    KeyFactory kf = KeyFactory.getInstance("RSA"); 
    PrivateKey privKey = kf.generatePrivate(keySpec); 

Здесь не удается kf.generatePrivate(keySpec). и я получил:

algid parse error, not a sequence. 

остальная часть кода:

KeyStore.PrivateKeyEntry entry = new KeyStore.PrivateKeyEntry(privKey, new Certificate[ {certificate}); 
    keyStore.setEntry(keyStoreAlias,entry , new KeyStore.PasswordProtection(pwd.toCharArray())); 
+0

Как создать хранилище ключей во время выполнения, или это довольно статическая установка? – Hannes

+0

это будет своего рода виртуальное хранилище ключей. Я не знаю, правильно ли импортирую сертификат. –

+0

Может быть, это потому, что я использую pkcs12, а закрытый ключ определяется как pkcs8? но я не знаю, как это сделать программно –

ответ

1

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

 KeyStore keystore; 

     java.security.Security.addProvider(
       new org.bouncycastle.jce.provider.BouncyCastleProvider() 
     ); 

     PEMParser pemParser = new PEMParser(new StringReader(privateKey)); 
     Object object = pemParser.readObject(); 
     PEMDecryptorProvider decProv = new JcePEMDecryptorProviderBuilder().build(pwd.toCharArray()); 
     JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC"); 
     KeyPair kp; 
     if (object instanceof PEMEncryptedKeyPair) { 
      kp = converter.getKeyPair(((PEMEncryptedKeyPair) object).decryptKeyPair(decProv)); 
     } else { 
      kp = converter.getKeyPair((PEMKeyPair) object); 
     } 
     RSAPrivateKey result = (RSAPrivateKey)kp.getPrivate(); 

     keystore= KeyStore.getInstance("pkcs12"); 
     keystore.load(null, pwd.toCharArray()); 
     keystore.setKeyEntry(keyStoreAlias, result, pwd.toCharArray(), new Certificate[]{certificate}); 

Спасибо всем, кто предложил какие-либо решения или задал вопросы.

Смежные вопросы