Convert a PKCS#8 private key to PEM in 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, чтобы преобразовать файл private.key обратно в форматированный файл pem.

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

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

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

7
задан Hiro2k 25 August 2010 в 14:35
поделиться

2 ответа

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

9
ответ дан 6 December 2019 в 12:45
поделиться

Используйте верхний колонтитул:

-----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 и закодировать ее. Уточните, пожалуйста, это то, что вам нужно.

2
ответ дан 6 December 2019 в 12:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: