如何使用OpenSSL从.cer文件中提取RSA公钥并将其存储在.pem文件中?

45

我需要从一个 *.cer 文件中提取公钥(RSA)。我想要提取这个密钥并将其存储在一个 .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 文件中?


Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎不属于编程或开发范畴。请参阅帮助中心中的我可以在这里问什么样的问题。也许超级用户Unix&Linux Stack Exchange更适合提问。另请参阅我应该在哪里发布Dev Ops相关问题? - jww
23
经常是开发人员需要应对这些事情。关于证书管理,Stack Overflow 上有很多问题。这不是针对超级用户、Linux 或 Dev Ops 的,它们都不够具体。我相信这实际上是正确的地方。 - Ghoti
2个回答

93

通过使用这个命令,我能够生成包含公钥内容的.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-----

4
谢谢。只需更正一点:对于一个 .cer 文件输入,inform 参数应该是 der - Gobe
2
我非常确信我在答案中写的是正确的,而且对我有效... 我确实使用了“-inform pem”。虽然如果“-inform der”也可以工作,那就很棒了。 - Steven Anderson
33
对于其他尝试此操作的人来说,“-inform DER”对我无效,但是“-inform PEM”有效。 - Andrew Corkery
天啊,我找了这么久。对我来说,这是令人震惊的事情,我们应该使用-noout而不是-out与重定向到文件。 我尝试从谷歌 OAuth jwks_url v1 接收的 PEM 文件中提取公钥,现在终于做到了。谢谢。 - Sergey Ponomarev
1
尽管 OP 的意图是与 jsencrypt 一起使用,因此他的问题得到了答复,但它特别询问了 RSA (PKCS#1) 公钥,而这个答案似乎提供了 PKCS#8 格式的公钥。OP 最初的问题是否可行?不同之处在于 RSA 公钥以 BEGIN RSA PUBLIC KEY 开头,而 PKCS#8 公钥以 BEGIN PUBLIC KEY 开头。如果我可以自己找到答案,我会提供另一种解决方案。 - tresf
我的问题的解决方案(RSA格式,根据原始请求)在这里可用:https://dev59.com/fWMl5IYBdhLWcg3w5KXd#27930720 - tresf

3

PowerShell的解决方案:

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

C#的解决方案:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接