【问题标题】:How to get .pem file from .key and .crt files?如何从 .key 和 .crt 文件中获取 .pem 文件?
【发布时间】:2010-11-02 18:26:14
【问题描述】:

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

这些是我可用的文件:

  • .crt
  • server.csr
  • server.key

【问题讨论】:

标签: ssl openssl pem asn.1 der


【解决方案1】:

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

cat server.crt server.key > server.pem

【讨论】:

  • 注意缺少换行符,我们的 pem 文件可能出现乱码,例如 -----END CERTIFICATE------------BEGIN CERTIFICATE-----
【解决方案2】:

您的密钥可能已经采用 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”来命名文件,以帮助您管理您保留在此文件中的权限。

【讨论】:

  • 检查 server.key 的格式。我只假设它是RSA。但是阅读文件的第一行可能会告诉你。
  • 请注意cat server.crt server.key > server.pem 不会将打开的评论放在自己的行上,这似乎是一项要求。快递邮件让我大吃一惊,我花了好几个小时才弄清楚出了什么问题。
  • 谢谢格雷厄姆。不同的工具会以不同的方式生成文件,最终,一些验证是好的。例如,当我执行这些步骤时,文件以换行符结尾。
  • 关于将 .crt 和 .key 文件连接在一起的提示非常有用。我想将我的证书与 stunnel3 一起使用,但它无法指定密钥文件。使用串联工作。 (实际上,由于 stunnel3 是一个 Perl 程序,我自己为它添加了一个用于读取密钥文件的选项。但是,由于我后来看到串联工作,我已经将 stunnel3 恢复为原始代码。)
  • 说 cat server.crt server.key > server.includesprivatekey.pem 对带有 haproxy 1.5 的 SSL 很有用。
【解决方案3】:

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

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

【讨论】:

  • 如果你想要一个以-----BEGIN RSA PRIVATE KEY----- 开头的文件并且有一个以-----BEGIN ENCRYPTED PRIVATE KEY----- 开头的文件,这就是你想要使用的命令。
【解决方案4】:

我需要为 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

【讨论】:

  • 使用 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/
  • 如果您的输入是 pem 文件,则第二个命令不会执行任何操作,因此假设它是,您只需要第一个命令
  • 太棒了!这对我来说效果很好!只需使用您的代码行将我的 .key 和 .crt 文件转换为 .pem,然后我通过 AWS 控制台上传(复制/粘贴)。谢谢!
【解决方案5】:

我观察到的是:如果您使用 openssl 生成证书,它会同时捕获 crt 文件中的文本部分和 base64 证书部分。严格的 pem 格式表示 (wiki definition) 文件应该以 BEGIN 和 END 开头和结尾。

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

因此,对于一些需要严格 pem 格式的库(我在 java 中遇到过),生成的 crt 将作为“无效 pem 格式”验证失败。

即使您使用 BEGIN/END CERTIFICATE 复制或 grep 行,并将其粘贴到 cert.pem 文件中,它也应该可以工作。

这是我所做的,不是很干净,但对我有用,基本上它会过滤从 BEGIN 行开始的文本:

grep -A 1000 BEGIN cert.crt > cert.pem

【讨论】:

  • 另一种选择是简单地通过openssl x509传递非严格证书。它将输出一个有效的 PEM 证书:cat certificate.crt | openssl x509 > certificate.pem
  • 如果您想获取从“BEGIN”到文件末尾的所有内容,这就是 sed 的工作。具体来说,在这种情况下,您需要 sed -n '/--BEGIN/,$p' cert.crt 之类的东西。解释一下:“-n”告诉 sed 默认不打印任何内容,然后范围表达式 /--BEGIN/,$ 使 p 命令(打印)适用于包含 --BEGIN 的第一行和结尾之间的行文件 ($)。
【解决方案6】:
  1. 通过 appleId 从临时门户下载证书,
  2. 从 Key 链中导出证书并提供名称 (Certificates.p12),
  3. 打开终端并转到保存上述 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”。

【讨论】:

    【解决方案7】:

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

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

    【讨论】:

      【解决方案8】:

      我试图从 Godaddy 转到应用引擎。使用这条线的诀窍是什么:

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

      完全一样,但将 name 替换为我的域名(这并不重要)

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

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

      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
      

      完全一样,除了我使用 name.unencrypted.priv.key 而不是 privateKey.key,我使用 name.crt 而不是 www_mydomain_com.crt

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

      .. 这终于奏效了。

      【讨论】:

      • (godaddy) 这对我有用。 1st-在使用服务器类型“Apache”的第一行后下载证书。然后我在 nginx.conf 中分别将 public.pem 和 private.pem 用于 ssl_certificate 和 ssl_certificate_key :)
      【解决方案9】:

      尝试将 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.
      【解决方案10】:
      • 打开终端。
      • 转到您的证书所在的文件夹。
      • 通过将 name 替换为您的证书来执行以下命令。

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

      • 希望它能奏效!!

      【讨论】:

        猜你喜欢
        • 2020-11-21
        • 1970-01-01
        • 2022-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-02
        相关资源
        最近更新 更多