berry_burr
berry_burr

Reputation: 351

Import private key from pem file into keystore

I am new in using keystores, is there a way to create a keystore when I have cert file and a private key in pem format? Please help

   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);

It fails here kf.generatePrivate(keySpec). and I got:

algid parse error, not a sequence.

the rest of the code:

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

Upvotes: 0

Views: 2318

Answers (1)

berry_burr
berry_burr

Reputation: 351

ok, after some research I ended up with this piece of code, which is perfectly working for me. So, I post it in here, in case if someone is looking for the same solution.

        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});

Thanks to all who suggested any solutions or put questions.

Upvotes: 2

Related Questions