2013-02-17 2 views
15

С сертификатом PEM какНадувной замок: PEMReader => PEMParser

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

с использованием BC 1.46, я извлечь ключей со следующим кодом:

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

Теперь я только что установил BC 1,48, и они говорят мне, что PEMReader устарел и должен быть заменен PEMParser.

Моя проблема, AFAIK, в PEMParser нет места для пароля.

Может ли кто-нибудь дать мне пример переноса моего кода на версию PEMParser?

ТИА

ответ

29

мне просто нужно было решить ту же проблему и не нашел ответа. Итак, я потратил некоторое время на изучение API BC и нашел решение, которое работает для меня. Мне нужно было прочитать секретный ключ из файла, поэтому параметр privateKeyFileName вместо параметра pemString в методе myFunc.

Использование BC 1.48 и 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

Если закрытый ключ находится в формате PKCS # 8, объект будет экземпляром PrivateKeyInfo. Вам нужно будет использовать объект 'converter.getPrivateKey ((PrivateKeyInfo));' – gtrig

+1

Brilliant, это помогло мне адаптировать мое использование класса устаревших BC 1.46 org.bouncycastle.openssl.PEMReader для новой техники PEMParser. Спасибо огромное! – Jeffro

+1

@xwatch Привет, вы могли бы предоставить импорт, пожалуйста? Невозможно найти класс PEMParser - я новый, используя MAVEN, и у меня есть эта зависимость. org.bouncycastle bcprov-jdk15on 1,56 не могу заставить его работать. –

1

Для версии 1.55 из bcpkix-jdk15on дешифрования кода изменяется на это:

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

Я не проверял, если это ошибка в ответе выше или просто разницу API между версиями.

Смежные вопросы