Преобразовать закрытый ключ PKCS # 8 в PEM в Java - PullRequest
7 голосов
/ 25 августа 2010

Привет всем, я пытаюсь преобразовать закрытый ключ 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?Я не могу использовать OpenSSL из моей программы, иначе я бы просто добавил этот вызов функции.У меня есть доступ к библиотекам BouncyCastle в этой программе, поэтому, возможно, у нее есть решение, которое я пропускаю.

Ответы [ 3 ]

9 голосов
/ 25 августа 2010

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

5 голосов
/ 16 сентября 2012

Тот факт, что 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();
2 голосов
/ 25 августа 2010

Используйте заголовок:

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

...