PEM (PEM 编码)
定义
PEM 是一种把 DER 二进制数据做 Base64 编码、再用 BEGIN 和 END 行包起来的文本格式,是存放证书和私钥最常见的方式。
PEM 是类 Unix 系统上证书、私钥和 CSR 最常用的文本编码。它把对象的二进制 DER 编码做 Base64 转换,每行 64 个字符,再在前后加上标明类型的头尾行,例如 BEGIN CERTIFICATE、BEGIN PRIVATE KEY、BEGIN CERTIFICATE REQUEST。这个名字来自上世纪 90 年代初的"隐私增强邮件"(Privacy-Enhanced Mail)标准,那套邮件方案没有流行起来,编码格式却沿用至今,现在由 RFC 7468 描述。
为什么重要
nginx、Apache、HAProxy、Postfix、curl 以及大多数 Linux 工具都使用 PEM。它是纯文本,一个文件里可以依次放多个对象,fullchain 文件和 CA 证书包就是这么来的;它也方便直接粘贴到宝塔面板、云厂商控制台的文本框里。很多部署问题其实出在粘贴环节:多了空格、少了横线,或者把私钥和证书贴反了。理解了"PEM 只是 DER 外面包了一层",格式转换就不再神秘。
例子
-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIUJ3...(Base64,每行 64 个字符)...
-----END CERTIFICATE-----
openssl x509 -in example.com.pem -outform DER -out example.com.der
常见误区
- PEM 是一种证书类型。 它只是编码方式,同一张证书既可以存成 PEM 也可以存成 DER。
- .pem 文件里一定是证书。 也可能是私钥、CSR、证书链,或者几种混在一起。
- 粘贴时少几个字符无所谓。 少了横线、BEGIN 行不完整或 Base64 内容缺字符,文件都会无法解析。