什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

Noa*_*ich 1630 certificate pki

我负责维护两台 Debian 服务器。每次我必须对安全证书做任何事情时,我都会谷歌搜索教程并击败它,直到它最终起作用。

然而,在我的搜索中,我经常遇到不同的文件格式(.key, .csr, .pem),但我从来没有找到对每种文件格式的用途的很好的解释。

我想知道 ServerFault 的好人是否可以就此问题提供一些说明?

sys*_*138 1989

SSL 已经存在了足够长的时间,您会认为会就容器格式达成一致。你是对的,有。太多的标准,因为它发生。最后,所有这些都是以机器可读的方式对抽象语法表示法 1 (ASN.1)格式的数据(恰好是 x509 证书定义的格式进行编码的不同方式。

  • .csr - 这是一个证书签名请求。一些应用程序可以生成这些以提交给证书颁发机构。实际格式是RFC 2986 中定义的 PKCS10 。它包括所请求证书的一些/所有关键细节,例如主题、组织、状态、诸如此类,以及要签名的证书的公钥。这些由 CA 签名并返回证书。返回的证书是公共证书(包括公钥但不包括私钥),它本身可以采用多种格式。
  • .pem - 在 RFC 142214211424系列的一部分)中定义,这是一种容器格式,可能仅包含公共证书(例如 Apache 安装和 CA 证书文件/etc/ssl/certs),或者可能包含整个证书链,包括公钥、私钥和根证书。令人困惑的是,由于 PKCS10 格式可以转换为 PEM ,因此它也可能对 CSR 进行编码(例如此处使用的)。该名称来自Privacy Enhanced Mail (PEM),这是一种失败的安全电子邮件方法,但它使用的容器格式仍然存在,并且是 x509 ASN.1 密钥的 base64 转换。
  • .key - 这是一个(通常)PEM 格式的文件,仅包含特定证书的私钥,并且只是一个常规名称而不是标准化名称。在 Apache 安装中,这经常驻留在/etc/ssl/private. 这些文件的权限非常重要,如果设置错误,一些程序会拒绝加载这些证书。
  • .pkcs12 .pfx .p12 - 最初由 RSA 在公钥加密标准(缩写为 PKCS)中定义,“12”变体最初由 Microsoft 增强,后来作为RFC 7292提交。这是一种受密码保护的容器格式,包含公共和私有证书对。与 .pem 文件不同,此容器是完全加密的。Openssl 可以将其转换为具有公钥和私钥的 .pem 文件:openssl pkcs12 -in file-to-convert.p12 -out converted-file.pem -nodes

不时出现的其他一些格式:

  • .der - 一种以二进制编码 ASN.1 语法的方法,.pem 文件只是一个 Base64 编码的 .der 文件。OpenSSL 可以将这些转换为 .pem ( openssl x509 -inform der -in to-convert.der -out converted.pem)。Windows 将这些视为证书文件。默认情况下,Windows 会将证书导出为具有不同扩展名的 .DER 格式文件。喜欢...
  • .cert .cer .crt - 具有不同扩展名的 .pem(或很少使用 .der)格式的文件,Windows 资源管理器将其识别为证书,而 .pem 则不然。
  • .p7b .keystore - 在RFC 2315 中定义为 PKCS 编号 7,这是 Windows 用于证书交换的格式。Java 本身就理解这些,并且经常.keystore用作扩展。与 .pem 风格的证书不同,这种格式有一种定义的方式来包含证书路径证书。
  • .crl - 证书吊销列表。证书颁发机构生成这些作为在到期前取消对证书的授权的一种方式。您有时可以从 CA 网站下载它们。

总之,有四种不同的方式来呈现证书及其组件:

  • PEM - 由 RFC 管理,由开源软件优先使用,因为它是基于文本的,因此不太容易出现翻译/传输错误。它可以有多种扩展名(.pem、.key、.cer、.cert 等)
  • PKCS7 - Java 使用并受 Windows 支持的开放标准。不包含私钥材料。
  • PKCS12 - 后来在 RFC 中定义的 Microsoft 私有标准,与纯文本 PEM 格式相比,它提供了增强的安全性。这可以包含私钥和证书链材料。Windows系统优先使用,可以通过openssl自由转换为PEM格式。
  • DER - PEM 的父格式。将其视为 base64 编码的 PEM 文件的二进制版本会很有用。在 Windows 之外不经常使用。

我希望这有帮助。

  • 标准的伟大之处在于有很多可供选择... (368认同)
  • PEM 是一种文件格式,可能由证书(又名公钥)、私钥或实际上两者连接在一起组成。不要太在意文件扩展名;这意味着隐私增强邮件,它没有看到太多用处,但文件格式仍然存在。 (52认同)
  • .crt 是 .cert 和 .cer 的另一个常见扩展名 (44认同)
  • 不禁注意到“隐私增强电子邮件”会给出首字母缩写词“PEE”,而不是“PEM”。RFC 倾向于使用短语“隐私增强邮件” (30认同)
  • 非常有用的答案,但我认为您没有涵盖由 `ssh-keygen` 创建的 .pub 格式。了解这与其他方面的关系会很有用。 (28认同)
  • @psoft `openssl x509 -text -in given.pem` (4认同)
  • @AJP OpenSSH id_blah.pub 文件(加上 known_hosts 和 authorized_keys)是公钥但不是证书,并且使用与本问答中 OpenSSL PEM 文件完全不同的格式:没有标题/尾随,没有内部换行符,空格分隔的标签) 加上 XDR 的 base64 而不是 BER 数据结构。 (3认同)
  • 似乎提及 Java 的 JKS 格式和相关的 keytool 命令会很有用。这是编码证书和密钥的第五种相当常见的方法。 (3认同)
  • 强制性 XKCD:https://xkcd.com/927/ (3认同)
  • PEM 文件实际上可以包含最多(或可能超过)4 个证书 - 这实际上是 OpenSSL 验证完整权限链所必需的。请参阅 http://www.digicert.com/ssl-support/pem-ssl-creation.htm 了解更多详细信息。 (2认同)
  • 快速浏览 RFC 1421、1422、1423、1424,我没有看到任何有关“-----BEGIN CERTIFICATE-----”格式的内容,只有“-----BEGIN PRIVACY-ENHANCED MESSAGE----” -` 示例。证书的 .pem 格式实际上在任何地方定义吗?我错过了吗? (2认同)

Jam*_*s F 171

PEM 本身不是证书,它只是一种编码数据的方式。X.509 证书是一种通常使用 PEM 编码的数据类型。

PEM 是 X.509 证书(其结构使用 ASN.1 定义),使用 ASN.1 DER(可分辨编码规则)编码,然后通过 Base64 编码运行并卡在纯文本锚行(BEGIN CERTIFICATE 和 END CERTIFICATE)之间)。

您可以使用 PKCS#7 或 PKCS#12 表示法来表示相同的数据,并且可以使用 openssl 命令行实用程序来执行此操作。

PEM 的明显好处是可以安全地粘贴到电子邮件正文中,因为它具有锚线并且是 7 位干净的。

RFC1422有更多关于 PEM 标准的详细信息,因为它与密钥和证书有关。

  • 要将 DER 文件 (.crt .cer .der) 转换为 PEM:`openssl x509 -inform der -in cert.cer -out cert.pem`。要将 PEM 文件转换为 DER:`openssl x509 -outform der -in cert.pem -out certi.der`。要将包含私钥和证书的 PKCS#12 文件 (.pfx .p12) 转换为 PEM:`openssl pkcs12 -in keyStore.pfx -out keyStore.pem -nodes`。要将 PEM 证书文件和私钥转换为 PKCS#12 (.pfx .p12):`openssl pkcs12 -export -out cert.pfx -inkey privateKey.key -in cert.crt -certfile CACert.crt` 来自 [here ](https://www.sslshopper.com/article-most-common-openssl-commands.html) (9认同)
  • “PEM 是 X.509 证书...”是不正确的,PEM 只是一种容器格式。PEM 文件可以包含任何内容,例如 X509 证书、PKCS#1、PKCS#8 私钥...因此,准确了解 PEM 文件包含的内容非常重要 -> 中的文本“BEGIN <something>” PEM 文件应该告诉您 PEM 包含什么。我在此要点中列出了 PEM 文件的一些常见用法:https://gist.github.com/tuansoibk/0b1f279be5c1b782d95f4e15af1442cb (4认同)
  • “PEM 本身不是证书...”和“PEM 是 X.509 证书...”是有点争议的句子。 (3认同)

小智 62

有时.crt文件已经是.pem. 请参阅:https : //stackoverflow.com/questions/991758/openssl-pem-key

  • 确实如此,我今天才注意到这一点。我必须在机架空间负载均衡器中输入 PEM 证书,我想知道生成的 crt 是否采用该格式。但它是这样工作的,所以这也是我的结论,其中大部分 .crt 似乎都是 PEM 格式。 (4认同)
  • @GlennPlas 焦点而不是文件的**内容**,而不是其名称或扩展名。对于所有重要的事情,它都可以称为“.foobar”... (2认同)