Как извлечь открытый ключ RSA из .cer и сохранить его в .pem с помощью OpenSSL?

У меня есть требование извлечь открытый ключ (RSA) из файла *.cer. Я хочу извлечь ключ и сохранить его в файле .pem, чтобы использовать его значение для шифрования значений с помощью jsencrypt.

Следующая команда преобразует .cer в .pem:

openssl x509 -inform der -in certificate.cer -out certificate.pem

Однако он генерирует не файл с открытым ключом, а файл с содержимым файла *.cer.

-----BEGIN CERTIFICATE-----
MIICPDCCAamgAwIBAg............
*lots of extra contents*
-----END CERTIFICATE-----

Какую команду следует использовать для извлечения открытого ключа и сохранения его в файле .pem?


person Steven Anderson    schedule 21.01.2015    source источник
comment
Stack Overflow — это сайт для вопросов по программированию и разработке. Этот вопрос кажется не по теме, потому что он не о программировании или разработке. См. раздел О каких темах я могу задать здесь в Справочном центре. Возможно, Суперпользователь или Unix & Linux Stack Exchange лучше спросить. См. также раздел Где размещать вопросы о Dev Ops?   -  person jww    schedule 22.09.2016
comment
Борьба с этими вещами часто является уделом разработчика. На SO много вопросов об управлении сертификатами. Это не Super User, не Linux и не Dev Ops, которые недостаточно специфичны. Я считаю, что это действительно правильное место.   -  person Ghoti    schedule 17.08.2017
comment
Согласен. @jww вообще не помогает сообществу stackoverflow. Ребят сообщите пожалуйста   -  person tnkh    schedule 04.06.2021


Ответы (2)


Используя эту команду, я смог сгенерировать .pem с содержимым открытого ключа.

openssl x509 -inform der -in certificate.cer -pubkey -noout > certificate_publickey.pem

Что производит:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsM+whXrxmbCkPfkwY2EehYpIp
*blah blah blah blah*
-----END PUBLIC KEY-----
person Steven Anderson    schedule 21.01.2015
comment
Спасибо. Просто поправка: для ввода файла .cer параметр inform должен быть der - person Gobe; 25.05.2016
comment
Я был почти уверен, что то, что я написал в своем ответе, было правильным и действительно сработало для меня... Я использовал -inform pem. Хотя если -inform der тоже работает, то это круто. - person Steven Anderson; 27.04.2017
comment
Для всех, кто пытается это сделать, -inform DER у меня не сработает, а -inform PEM сработает. - person Andrew Corkery; 30.01.2018
comment
ОМГ, я так долго это искал. Для меня сногсшибательно то, что вместо -out мы должны использовать -noout с перенаправлением в файл. Я попытался извлечь ключ паба из файла PEM, полученного от Google OAuth jwks_url v1, и теперь я, наконец, сделал это. Спасибо - person Sergey Ponomarev; 01.02.2020
comment
Хотя OP намеревается использовать это с jsencrypt, поэтому на его вопрос был дан ответ, он конкретно спрашивает об открытом ключе RSA (PKCS # 1), но этот ответ, по-видимому, предлагает открытый ключ в формате PKCS # 8. Возможен ли исходный вопрос ОП? Разница в том, что открытые ключи RSA начинаются с BEGIN RSA PUBLIC KEY, а не PKCS#8, которые начинаются с BEGIN PUBLIC KEY. Если я смогу найти ответ самостоятельно, я предоставлю его в качестве альтернативного решения. - person tresf; 07.07.2021
comment
Решение моего вопроса (формат RSA по исходному запросу OP) доступно здесь: stackoverflow.com/a/27930720/3196753 - person tresf; 07.07.2021

Решение для PowerShell:

$certFile = "[path to .cer file]"
$cer = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($certFile)
$cer.PublicKey.Key.ToXmlString($false)

Решение от С#:

string certificate = @"<PATH TO .CER>"; 
X509Certificate2 cert = new X509Certificate2(certificate); 
string xml = cert.GetRSAPublicKey().ToXmlString(false);
person amy8374    schedule 12.04.2021