Преобразование закрытого ключа PKCS#8 в PEM в java

Привет всем я пытаюсь преобразовать закрытый ключ PKCS#8, который я генерирую в своей программе java, в файл с кодировкой PEM.

Security.addProvider(new BouncyCastleProvider());
SecureRandom rand = new SecureRandom();
JDKKeyPairGenerator.RSA keyPairGen = new JDKKeyPairGenerator.RSA();        
keyPairGen.initialize(2048, rand);
KeyPair keyPair = keyPairGen.generateKeyPair();

PEMWriter privatepemWriter = new PEMWriter(new FileWriter(new File(dir + "private.key")));
privatepemWriter.writeObject(keyPair.getPrivate());

после запуска программы у меня есть закрытый ключ в обоих форматах и открытый ключ(код не отображается, как он работает). Затем я использую эту команду openssl для передачи частного.ключ назад к формованному файлу pem.

openssl pkcs8 -nocrypt -inform DER -in private.key -out private2.pem

когда я сравниваю частная.pem и private2.pem они разные и, очевидно, когда я пытаюсь использовать private.pem это говорит, что это недействительный файл.

какой шаг мне не хватает, чтобы правильно преобразовать этот закрытый ключ в формат PEM, который мне нужен? Я не могу использовать OpenSSL из моей программы, иначе я бы просто добавил этот вызов функции. У меня есть доступ к BouncyCastle libs в этой программе, поэтому, возможно, у него есть решение, которое я упускаю.

3 ответов


можно использовать PEMWriter класс В Bouncycastle.


тот факт, что OpenSSL использует свой собственный формат, действительно единственное, что делает это сложным. К счастью, надувной замок PEMWriter делает это легко, но интерфейс не очень хорошо документирован. Я нашел код, просмотрев список рассылки. Я адаптировал его ниже:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair keyPair = keyGen.generateKeyPair(); 
StringWriter stringWriter = new StringWriter();
PEMWriter pemWriter = new PEMWriter(stringWriter);  
pemWriter.writeObject( keyPair.getPrivate());
pemWriter.close();
privateKeyString = stringWriter.toString();

использовать следующий заголовок:

-----BEGIN PRIVATE KEY-----

... и футер:

-----END PRIVATE KEY-----

обратите внимание, что" RSA " оставлен-код Java использует кодировку PKCS #8 для закрытого ключа, и эта кодировка включает алгоритм.

на openssl команда, которую вы показываете, преобразует стандартный ключ PKCS #8 в форме DER в проприетарный ключ OpenSSL в форме PEM. Чтобы сохранить формат PKCS #8, но преобразовать из DER в PEM, добавьте опцию-topk8. Тогда OpenSSL на выходе должно совпадать ваш код Java производит.

Если вам нужно создать ключ OpenSSL, а не PKCS #8, это возможно, но вам придется создать свою собственную структуру OpenSSL с BouncyCastle ASN.1 библиотека и закодировать это. Пожалуйста, уточните, если это то, что вам нужно.