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

Posted

技术标签:

【中文标题】如何从 .cer 中提取 RSA 公钥并使用 OpenSSL 将其存储在 .pem 中?【英文标题】:How to extract the RSA public key from a .cer and store it in a .pem using OpenSSL? 【发布时间】:2015-03-19 13:20:19 【问题描述】:

我需要从*.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 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super User 或Unix & Linux Stack Exchange 会是一个更好的提问地方。另见Where do I post questions about Dev Ops? 与这些东西作斗争通常是开发人员的职责。 SO上有很多关于证书管理的问题。它不是超级用户、Linux 或 Dev Ops,所有这些都不够具体。我相信这实际上是正确的地方。 同意。 @jww 根本没有帮助 *** 社区。伙计们请报告他 【参考方案1】:

使用此命令,我能够生成带有公钥内容的.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-----

【讨论】:

谢谢。只是一个更正:对于 .cer 文件输入,inform 参数应该是 der 我很确定我在回答中写的内容是正确的并且对我有用......我确实使用了-inform pem。虽然如果-inform der 也可以工作,那就太酷了。 对于尝试此操作的其他人,-inform DER 对我不起作用,但 -inform PEM 有效。 天啊,我找了这么久。这让我大吃一惊,我们应该使用 -noout 而不是 -out 重定向到文件。我试图从 Google OAuth jwks_url v1 收到的 PEM 文件中提取 pub 密钥,所以现在我终于做到了。谢谢 虽然 OP 的意图是将其与 jsencrypt 一起使用,所以他的问题得到了回答,它专门询问了 RSA (PKCS#1) 公钥,但这个答案似乎提供了 PKCS#8格式化的公钥。 OP的原始问题可能吗?不同之处在于 RSA 公钥以 BEGIN RSA PUBLIC KEY 开头,而 PKCS#8 以 BEGIN PUBLIC KEY 开头。如果我能自己找到答案,我会将其作为替代解决方案提供。【参考方案2】:

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);

【讨论】:

以上是关于如何从 .cer 中提取 RSA 公钥并使用 OpenSSL 将其存储在 .pem 中?的主要内容,如果未能解决你的问题,请参考以下文章

仅使用公钥的 CER 证书

在 Servlet 中读取客户端证书

关于ssh密钥对根据私钥提取公钥信息的方式

关于ssh密钥对根据私钥提取公钥信息的方式

使用Python从公钥获取RSA指数和模数

Web Crypto API:如何使用导入的 RSA 公钥加密数据并在 Ruby 中解密数据