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


Answers:


799

您的密钥可能已经是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

10
请注意,cat server.crt server.key > server.pem不要将开放评论置于自己的立场上,这似乎是必要条件。快递信使我死了,花了我几个小时才弄清楚出了什么问题。
Graham Walters 2014年

1
谢谢格雷厄姆。不同的工具将以不同的方式生成文件,最终,一些验证是好的。例如,当我执行这些步骤时,文件以换行符结尾。
maxwellb 2014年

有关将.crt和.key文件串联在一起的技巧非常有用。我想将我的证书与stunnel3一起使用,但是它没有指定密钥文件的方法。使用串联工作。(实际上,由于stunnel3是Perl程序,因此我自己为其添加了一个用于读取密钥文件的选项。但是,由于稍后看到了串联,因此我将stunnel3还原为其原始代码。)
LS

2
server.crt server.key > server.includesprivatekey.pem碰巧的是,cat 对于haproxy 1.5的SSL很有用。
jimm101 2014年

224

我需要针对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


19
使用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 2014年

1
如果您的输入是pem文件,第二个命令不执行任何操作,因此假设它是,则只需要第一个命令
Kristofer

太棒了!这对我来说很好!只需使用您的代码行将我的.key和.crt文件转换为.pem,然后我通过AWS控制台上传(复制/粘贴)。谢谢!
迭戈D

79

一个pem文件包含证书和私钥。这取决于您的证书/密钥所采用的格式,但是可能就这么简单:

cat server.crt server.key > server.pem

我不断得到-bash: server.key.pem: Permission denied
tq 2014年

2
@tq:这意味着不允许您读取或写入该文件。
2014年

谢谢@sth会寻求许可。但我使用sudo命令执行此操作
2014年

8
@tq:cat server.crt server.key | sudo tee server.pem
dimir 2014年

2
当心缺少换行符的情况,我们的pem文件可能会出现乱码,例如----- END CERTIFICATE ---------- BEGIN CERTIFICATE -----
Wolfgang Fahl 2016年

24

另外,如果您不希望它要求输入密码,则需要运行以下命令:

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

9
如果您想要一个以开头的文件,-----BEGIN RSA PRIVATE KEY-----并且想要一个以开头的文件-----BEGIN ENCRYPTED PRIVATE KEY-----,这就是您要使用的命令。
菲利普·格柏

18

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

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

4

我观察到的是:如果使用openssl生成证书,它将捕获crt文件中的文本部分和base64证书部分。严格的pem格式表示(维基定义),该文件应以BEGIN和END开始和结束。

.pem –(隐私增强邮件)Base64编码的DER证书,包含在“ ----- BEGIN CERTIFICATE -----”和“ ----- END CERTIFICATE -----”之间

因此,对于某些要求严格的Pem格式的库(我在Java中遇到过),生成的crt将无法通过“无效的pem格式”进行验证。

即使您使用BEGIN / END CERTIFICATE复制或grep行,并将其粘贴到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转到App Engine。诀窍是使用此行:

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

完全照原样,但是用我的域名替换名称(实际上并不重要)

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

然后,我打开csr,将其复制,粘贴到go daddy中,然后下载,解压缩,使用终端导航到解压缩的文件夹并输入:

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

然后,我使用了来自Trouble的有关Google Apps自定义域SSL的说明,这些说明是:

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

完全按原样,除了我使用name.unencrypted.priv.key而不是privateKey.key,并且我使用name.crt代替www_mydomain_com.crt

然后,我将public.pem上传到管理控制台以获取“ PEM编码的X.509证书”,并上传了private.pem来获取“未加密的PEM编码的RSA私钥”。

..终于奏效了。


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

这对我不起作用An error occurred (MalformedCertificate) when calling the UploadServerCertificate operation: Unable to parse certificate. Please ensure the certificate is in PEM format.
Adam Raudonis

4
  1. 通过appleId从临时门户下载证书,
  2. 从钥匙链中导出证书并命名(Certificates.p12),
  3. 打开终端和goto文件夹,在其中保存上述Certificates.p12文件,
  4. 运行以下命令:

    a)openssl pkcs12 -in Certificates.p12 -out CertificateName.pem -nodes

    b) openssl pkcs12 -in Certificates.p12 -out pushcert.pem -nodes -clcerts

  5. 您的.pem文件已准备好“ pushcert.pem”。

0
  • 打开终端。
  • 转到证书所在的文件夹。
  • 通过用证书替换名称来执行以下命令。

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

  • 希望它能工作!!
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.