从 PEM 文件生成 crt 和 key 文件。

3

我看到其他帖子关于将PEM文件转换为crt和key文件,像这样one,但对我没有起作用。

使用openssl x509 -outform der -in your-cert.pem -out your-cert.crt可以生成一个crt文件,但如何生成相应的key文件呢?假设key文件必须与crt文件配对使用?

有一些帖子建议像这样one,只需将文件扩展名从.pem更改为.crt.key即可完成任务。我尝试更改文件扩展名,但在使用crt和key文件启动golang中的https服务器时,它没有起作用。错误是:在私钥的PEM中找到了证书而不是密钥。这是有道理的,因为我打开的PEM文件只包含---BEGIN CERTIFICATE---END CERTIFICATE,没有关于密钥的内容。

我也尝试了openssl pkey -in mypemFile.pem -out foo.keyopenssl rsa -in mypemFile.pem -out foo.key,但都出现了错误:Expecting: ANY PRIVATE KEY

我的情况是我需要使用Golang创建一个https服务器,这需要一个crt和key文件来启动HTTPS服务器,例如:err:= s.ListenAndServeTLS(“../../mycert.crt”,“../../mykey.key”),但是公司安全团队给了我一个PEM文件,因此我想将PEM文件转换为crt和key文件。


这个回答解决了你的问题吗?将.pem转换成.crt和.key - jub0bs
@jub0bs它并没有说明如何生成密钥文件。 - dragonfly02
1
在使用工具之前,您可能希望了解更多有关密码学的工作原理以及证书(基本上是公钥)与其相关联的私钥之间的关系。此外,扩展名是无关紧要的,计算机并不关心。证书(和私钥)可以采用称为DER的“二进制”格式或更常见的编码为base64以便称为PEM进行更轻松的互操作性。文件名和扩展名不重要,只有内容才重要。 - Patrick Mevzek
1个回答

3
这里最重要的是:无法从证书中恢复私钥。 运行HTTPS服务器时,您需要2个对象:私钥和证书链(即服务器证书和可选的签名认证机构证书列表)。
以下是您需要遵循的步骤:
  1. 生成私钥对:openssl genrsa -out private.pem 2048。此命令将生成一个2048位的PEM格式RSA私钥,即带有-----BEGIN RSA PRIVATE KEY-----头和-----END RSA PRIVATE KEY-----尾部。

  2. 从私钥中提取公钥:openssl rsa -in private.pem -outform PEM -pubout -out public.pem。此命令以PEM格式从私钥中提取公钥,即带有-----BEGIN PUBLIC KEY-----头和-----END PUBLIC KEY-----尾部。

  3. 从公钥创建证书。此步骤的具体操作完全取决于您的证书颁发机构。但是仅供测试目的,您可以生成自签名证书。

  • 生成证书签名请求(CSR):openssl req -key private.pem -new -out mycert.csr。此命令将生成一个mycert.csr文件。根据您想在证书中找到的内容回答问题。

  • 自签署该CSR:openssl x509 -signkey private.pem -in mycert.csr -req -days 365 -out mycert.pem。此命令以PEM格式在mycert.pem文件中生成证书。

然后,您可以通过提供private.pemmycert.pem文件来启动服务器。

请注意,如果您的框架不支持私钥的PEM格式,则可以将其转换为其他格式:

  • PKCS#1:openssl rsa -inform pem -in private.pem -outform der -out private.key
  • PKCS#8:openssl pkcs8 -topk8 -inform PEM -outform DER -in private.pem -out private.pk8 -nocrypt

在尝试之前,必须先点赞,因为它听起来非常有前途!谢谢。 - dragonfly02
所以 mykey.pemmykey.key,以及 mycert.crtmycert.pem 是等效的,只是格式不同? - dragonfly02
1
@dragonfly02,没错。PEM编码基本上就是带有换行符的base64编码,前导和尾随行指示编码对象类型,并可选用元数据的标头。请看[源代码](https://cs.opensource.google/go/go/+/refs/tags/go1.20.2:src/encoding/pem/pem.go;l=240)。它真的很简单。 - Peter
抱歉,但是我该如何使用给定的PEM文件呢?我猜想我必须按照公司安全团队提供的方式来使用它。我的意思是,如果我生成自己的私钥和crt文件,不确定在调用内部API时是否会起作用。 - dragonfly02
@dragonfly02 如果是这样,您应该向安全团队请求两个文件:证书(或可能是证书链)和私钥。在您的服务器上设置TLS层需要这两个文件。 - Jcs
显示剩余2条评论

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