2013-02-17 5 views
15

Z certyfikatem PEM jakBouncy Castle: PEMReader => PEMParser

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

używając BC 1,46, wyodrębnić parę kluczy z następującego kodu:

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

Teraz wystarczy zainstalować BC 1.48, a mówią mi, że PEMReader jest przestarzały i musi zostać zastąpiony przez PEMParser.

Mój problem, AFAIK, nie ma miejsca na hasło w PEMParser.

Czy ktoś mógłby podać przykład, jak przenieść mój kod do wersji PEMParser?

TIA

Odpowiedz

29

po prostu potrzebne, aby rozwiązać ten sam problem i nie znalazł odpowiedzi. Spędziłem trochę czasu na studiowaniu BC API i znalazłem rozwiązanie, które działa dla mnie. Potrzebowałem odczytać klucz prywatny z pliku, więc istnieje parametr privateKeyFileName zamiast parametru pemString w metodzie myFunc.

Korzystanie BC 1,48 i 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

Jeśli klucz prywatny jest w formacie PKCS # 8, obiekt będzie instancją PrivateKeyInfo. Będziesz musiał użyć obiektu 'converter.getPrivateKey ((PrivateKeyInfo));' – gtrig

+1

Świetnie, to pomogło mi dostosować moje użycie wycofanej klasy BC 1.46 org.bouncycastle.openssl.PEMReader do nowszej techniki PEMParser. Dziękuję bardzo! – Jeffro

+1

@watchwatch Witaj, czy mógłbyś zapewnić import? Nie można odnaleźć klasy PEMParser -Jestem rodzaju wczesne wykrywanie chorób przy użyciu Maven i mam tę zależność org.bouncycastle bcprov-jdk15on 1,56 nie mogę zmusić go do pracy. –

1

dla wersji 1.55 z bcpkix-jdk15on te zmiany kodu deszyfrowania do tego:

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

nie sprawdzić, czy jest to błąd w powyższym odpowiedź lub tylko różnica API między wersjami.