2013-02-17 36 views
15

Mit einem PEM-Zertifikat wieBouncy Castle: PEMReader => PEMParser

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

BC mit 1,46, extrahiere ich das Schlüsselpaar mit dem folgenden Code:

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

Jetzt gerade habe ich installiert BC 1,48 und Sie sagen mir, dass PEMReader veraltet ist und durch PEMParser ersetzt werden muss.

Mein Problem ist, AFAIK, es gibt keinen Platz für ein Passwort in PEMParser.

Kann mir jemand ein Beispiel geben, wie ich meinen Code in eine PEMParser-Version migrieren kann?

TIA

Antwort

29

Ich brauche nur das gleiche Problem zu lösen und keine Antwort gefunden. Also habe ich etwas Zeit mit BC API verbracht und eine Lösung gefunden, die für mich funktioniert. Ich musste den privaten Schlüssel aus der Datei lesen, daher gibt es in der myFunc-Methode den Parameter privateKeyFileName anstelle des Parameters pemString.

Mit BC 1,48 und 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

Wenn der private Schlüssel im PKCS # 8-Format vorliegt, ist das Objekt eine Instanz von PrivateKeyInfo. Sie müssen 'converter.getPrivateKey ((PrivateKeyInfo) -Objekt) verwenden;' – gtrig

+1

Brilliant, dies hat mir geholfen, meine Verwendung der veralteten Klasse BC 1.46 org.bouncycastle.openssl.PEMReader an die neuere PEMParser-Technik anzupassen. Ich danke dir sehr! – Jeffro

+1

@xwatch Hallo, könnten Sie bitte Importe bereitstellen? Kann die Klasse PEMParser nicht finden -Ich bin irgendwie neu- mit MAVEN und habe diese Abhängigkeit org.bouncycastle bcprov-jdk15on 1,56 Kann es nicht an die Arbeit. –

1

Für Version 1.55 von bcpkix-jdk15on der Entschlüsselungscode wechselt:

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

ich nicht überprüfen, ob dies ein Fehler in der obigen Antwort ist oder nur ein API-Unterschied zwischen den Versionen.

Verwandte Themen