2013-02-17 7 views
15

Con un certificato PEM comeBouncy Castle: PEMReader => PEMParser

-----BEGIN RSA PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED 
DEK-Info: AES-256-CBC,B9846B5D1803E..... 

utilizzando aC 1,46, ho estrarre la coppia di chiavi con il seguente codice:

int myFunc(String pemString, char [] password) { 

    ByteArrayInputStream tube = new ByteArrayInputStream(pemString.getBytes()); 

    Reader fRd = new BufferedReader(new InputStreamReader(tube)); 

    PEMReader pr = new PEMReader(fRd, new Password (password), "BC"); 

    try { 
      Object o = pr.readObject(); 
      if (o instanceof KeyPair) 
    ..... 

Ora ho appena installato aC 1,48, e mi dicono che PEMReader è deprecato e deve essere sostituito da PEMParser.

Il mio problema è, AFAIK, non c'è posto per una password in PEMParser.

Qualcuno potrebbe darmi un esempio su come migrare il mio codice su una versione di PEMParser?

TIA

risposta

29

Avevo solo bisogno di risolvere lo stesso problema e ha trovato nessuna risposta. Quindi ho passato un po 'di tempo a studiare BC API e ho trovato una soluzione che funziona per me. Avevo bisogno di leggere la chiave privata dal file in modo che ci sia parametro privateKeyFileName invece parametro pemString nel metodo myFunc.

Utilizzando aC 1.48 e PEMParser:

int myFunc(String privateKeyFileName, char [] password) { 
    File privateKeyFile = new File(privateKeyFileName); // private key file in PEM format 
    PEMParser pemParser = new PEMParser(new FileReader(privateKeyFile)); 
    Object object = pemParser.readObject(); 
    PEMDecryptorProvider decProv = new JcePEMDecryptorProviderBuilder().build(password); 
    JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC"); 
    KeyPair kp; 
    if (object instanceof PEMEncryptedKeyPair) { 
     System.out.println("Encrypted key - we will use provided password"); 
     kp = converter.getKeyPair(((PEMEncryptedKeyPair) object).decryptKeyPair(decProv)); 
    } else { 
     System.out.println("Unencrypted key - no password needed"); 
     kp = converter.getKeyPair((PEMKeyPair) object); 
    } 
} 
+3

Se la chiave privata è in formato PKCS # 8, l'oggetto sarà un'istanza di PrivateKeyInfo. Dovrai usare l'oggetto 'converter.getPrivateKey ((PrivateKeyInfo))' – gtrig

+1

Brillante, questo mi ha aiutato ad adattare il mio uso della classe obsoleta BC 1.46 org.bouncycastle.openssl.PEMReader alla nuova tecnica PEMParser. Grazie mille! – Jeffro

+1

@xwatch Ciao, potresti fornire le importazioni per favore? Non riesci a trovare la classe PEMParser -Sono tipo di nuovo- utilizzando MAVEN e ho questa dipendenza org.bouncycastle bcprov-jdk15on 1,56 non riesco a farlo funzionare. –

1

per la versione 1.55 di bcpkix-jdk15on il codice di decrittazione modifiche al presente:

kp = ((PEMEncryptedKeyPair) object).decryptKeyPair(decryptorProvider); 

Non ho controllato se questo è un errore nella risposta di cui sopra o solo una differenza API tra le versioni.