如何从.key和.crt文件中获取.pem文件?

786

我如何从SSL证书创建PEM文件?

我有以下文件可用:

  • .crt
  • server.csr
  • server.key

4
相反的方式:.pem 转换为 .crt.key - kenorb
同一个问题可能有一些略微不同的答案,您可能会发现它们很有用:https://dev59.com/-G445IYBdhLWcg3w0NOu - NeilG
13个回答

1034

你的密钥可能已经是PEM格式,只是名字上带有.crt或.key扩展名。

如果文件内容以-----BEGIN开头,并且您可以在文本编辑器中读取它:

该文件使用base64编码,可用ASCII而非二进制格式进行阅读。证书已经是PEM格式。只需将扩展名更改为.pem即可。

如果文件是二进制的:

对于server.crt,您应该使用

openssl x509 -inform DER -outform PEM -in server.crt -out server.crt.pem

对于server.key文件,请使用openssl rsa替代openssl x509

server.key很可能是您的私钥,而.crt文件则是返回的已签名x509证书。

如果这是为Web服务器并且您无法指定加载单独的私钥和公钥:

您可能需要将两个文件串联起来。使用以下命令进行操作:

cat server.crt server.key > server.includesprivatekey.pem

我建议将文件命名为“includesprivatekey”,以帮助您管理保留此文件的权限。


2
检查 server.key 的格式。我只是假设它是 RSA。但是读取文件的第一行可能会告诉你这一点。 - maxwellb
18
提醒一下,cat server.crt server.key > server.pem 命令不会将开放注释置于单独的一行,而这似乎是必需的。Courier 邮件系统让我很苦恼,我花了数小时才弄清楚问题出在哪里。 - Graham Walters
1
谢谢Graham。不同的工具会以不同的方式生成文件,最终进行一些验证是很好的。当我执行这些步骤时,文件以换行符结尾,例如。 - maxwellb
1
连接.crt和.key文件的提示非常有帮助。我想在stunnel3中使用我的证书,但它没有指定密钥文件的方法。使用连接起来的文件可以解决这个问题。(实际上,由于stunnel3是一个Perl程序,我自己为它添加了一个选项来读取密钥文件。然而,后来我发现连接文件也可以工作,所以我将stunnel3恢复到了原始代码。) - Mr. Lance E Sloan
6
顺便提一下,使用cat server.crt server.key > server.includesprivatekey.pem可以方便地为haproxy 1.5配置SSL。 - jimm101
显示剩余5条评论

273

我需要为AWS ELB做这件事。在经历了多次失败的尝试后,最终这是让我成功的方法:

openssl rsa -in server.key -text > private.pem
openssl x509 -inform PEM -in server.crt > public.pem

感谢NCZ

编辑:如@floatingrock所说

使用AWS时,请不要忘记在文件名前添加file://。因此,它看起来像这样:

 aws iam upload-server-certificate --server-certificate-name blah --certificate-body file://path/to/server.crt --private-key file://path/to/private.key --path /cloudfront/static/

http://docs.aws.amazon.com/cli/latest/reference/iam/upload-server-certificate.html


21
在使用AWS时,别忘了在文件名之前加上file://。这样它会看起来像这样:aws iam upload-server-certificate --server-certificate-name blah --certificate-body file://~/Desktop/server.crt --private-key file://~/Desktop/private.key --path /cloudfront/static/ - FloatingRock
1
如果您的输入是 pem 文件,则第二个命令不起作用,因此假设它是 pem 文件,您只需要第一个命令。 - Kristofer
太棒了!这对我非常有用!只需使用您的代码行将我的.key和.crt文件转换为.pem,然后通过AWS控制台上传(复制/粘贴)。谢谢! - Diego D

109

pem文件包含证书和私钥。它取决于您的证书/密钥的格式,但可能只是这么简单:

cat server.crt server.key > server.pem

11
请注意缺少换行符,否则您的 pem 文件可能会出现混乱的行,如 -----END CERTIFICATE----------BEGIN CERTIFICATE-----。 - Wolfgang Fahl

34

此外,如果您不想让它要求输入密码,则需要运行以下命令:

openssl rsa -in server.key -out server.key

16
如果您想要一个以 -----BEGIN RSA PRIVATE KEY----- 开头的文件,但只有一个以 -----BEGIN ENCRYPTED PRIVATE KEY----- 开头的文件,那么您需要使用这个命令。 - Philippe Gerber
1
这也是您用来将密钥转换为与mysql兼容格式的方法。 - Matthew Lenz

21

这是创建 .pem 文件的最佳选项。

openssl pkcs12 -in MyPushApp.p12 -out MyPushApp.pem -nodes -clcerts

12
所有文件(*.crt, server.csr, server.key)可能已经是PEM格式,下一步要做什么取决于您想如何使用它们,或者使用它们的工具以及所需的格式。
在这里我会进一步解释用于存储加密材料的不同格式以及如何识别它们以及相互转换。
标准 | 标准 | 内容格式 | 文件编码 | 可能的内容 | | --- | --- | --- | --- | | X509 | X | | 证书 | | PKCS#1 | X | | RSA密钥(公钥/私钥) | | PKCS#7 | X | | 证书、CRLs | | PKCS#8 | X | | 私钥、加密的私钥 | | PKCS#12 | X | | 证书、CRLs、私钥 | | JKS | X | | 证书、私钥 | | PEM | | X | | | DER | | X | |
常见组合 | 内容 \ 编码 | PEM (*) | DER (**) | 二进制 | | --- | --- | --- | --- | | X509 | X | X | | | PKCS#1 | X | X | | | PKCS#7 (***) | X | X | | | PKCS#8 | X | X | | | PKCS#12 (***) | | | X | | JKS (***) | | | X |

这是一个Gist,它解释了相同的内容并提供了转换/验证/检查命令。

总之,处理加密/PKI材料的典型步骤如下:

  • 了解它们的格式(使用验证/检查命令)
  • 了解所需的格式(阅读文档)
  • 使用转换命令转换文件
  • 可选:使用验证/检查命令验证转换后的文件

9

我想从godaddy转移到app engine。关键在于使用了以下这行代码:

openssl req -new -newkey rsa:2048 -nodes -keyout name.unencrypted.priv.key -out name.csr

将名称替换为我的域名(实际上并不重要)。

我回答了所有与通用名称/组织相关的问题,如www.name.com。

然后我打开了csr,复制了它,在GoDaddy中粘贴了它,然后下载了它,解压缩了它,使用终端导航到未压缩的文件夹,并输入:

cat otherfilegodaddygivesyou.crt gd_bundle-g2-g1.crt > name.crt

我使用了来自Trouble with Google Apps Custom Domain SSL的以下说明:

openssl rsa -in privateKey.key -text > private.pem
openssl x509 -inform PEM -in www_mydomain_com.crt > public.pem

除了privateKey.key外,我使用了name.unencrypted.priv.key,而不是www_mydomain_com.crt,我使用了name.crt。然后,我将public.pem上传到“PEM编码X.509证书”的管理控制台,并将private.pem上传到“未加密PEM编码的RSA私钥”。最终,这样做可以解决问题。


这对我有用。首先,我下载了证书,并在服务器类型“Apache”上使用了第一行。然后,在nginx.conf中,我分别使用public.pem和private.pem作为ssl_certificate和ssl_certificate_key :) - Rick Penabella

6
在Windows操作系统中,您可以使用certutil工具:
certutil -encode server.crt cert.pem
certutil -encode server.key key.pem

您可以在PowerShell中像这样将两个文件合并为一个:

Get-Content cert.pem, key.pem | Set-Content cert-and-key.pem

在类似于CMD的命令行中:

copy cert.pem+key.pem cert-and-key.pem /b

1
这么多年过去了,仍然有人为这个问题做出贡献,真是太棒了。楼主 - Sergio Rodriguez

5
我观察到的是:如果您使用openssl生成证书,它会在crt文件中捕获文本部分和base64证书部分。严格的pem格式(维基定义)要求文件应以BEGIN和END开头和结尾。
.pem-(隐私增强邮件)Base64编码的DER证书,位于“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”之间。
因此,对于一些期望严格pem格式的库(我在java中遇到过这种情况),生成的crt将无法通过验证,因为它是“无效的pem格式”。
即使您复制或使用BEGIN / END CERTIFICATE行并将其粘贴到cert.pem文件中,它也应该可以工作。
以下是我的做法,不太干净,但对我有效,基本上它过滤从BEGIN行开始的文本:
grep -A 1000 BEGIN cert.crt > cert.pem

1
另一种选项是直接通过 openssl x509 传递非严格证书。它将输出有效的PEM证书:cat certificate.crt | openssl x509 > certificate.pem - T0xicCode
如果你想获取从“BEGIN”到文件结尾的所有内容,那么就需要使用sed。具体来说,在这种情况下,你需要像这样使用 sed -n '/--BEGIN/,$p' cert.crt。解释一下:"-n"告诉sed默认不打印任何东西,然后范围表达式/--BEGIN/,$使得p命令(打印)适用于包含"--BEGIN"的第一行和文件末尾($)之间的行。 - dannysauer

4
尝试将GoDaddy证书上传到AWS时,我多次失败,但最终很简单。不需要将任何东西转换为.pem格式。您只需确保在链参数中包括GoDaddy捆绑证书即可,例如:
aws iam upload-server-certificate
    --server-certificate-name mycert
    --certificate-body file://try2/40271b1b25236fd1.crt
    --private-key file://server.key
    --path /cloudfront/production/
    --certificate-chain file://try2/gdig2_bundle.crt

如果您想删除之前上传失败的文件,可以执行以下操作:

aws iam delete-server-certificate --server-certificate-name mypreviouscert

这对我没有起作用:“调用UploadServerCertificate操作时发生错误(MalformedCertificate):无法解析证书。请确保证书采用PEM格式。” - Adam Raudonis

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