Привет всем, я пытаюсь преобразовать закрытый ключ 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 в этой программе, поэтому, возможно, у нее есть решение, которое я пропускаю.
Вы можете использовать класс PEMWriter в Bouncycastle.
Используйте верхний колонтитул:
-----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 и закодировать ее. Уточните, пожалуйста, это то, что вам нужно.