2014-10-03 3 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}); 

솔루션을 제안하거나 질문을 던진 모든 사람에게 감사드립니다.

관련 문제