# PEM（PEM 编码）是什么？定义、例子与常见误区

> PEM 是一种把 DER 二进制数据做 Base64 编码、再用 BEGIN 和 END 行包起来的文本格式，是存放证书和私钥最常见的方式。

Source: https://ssl.sh/zh/glossary/pem/
Last updated: 2026-11-10

PEM 是类 Unix 系统上证书、私钥和 CSR 最常用的文本编码。它把对象的二进制 [DER](https://ssl.sh/zh/glossary/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](https://ssl.sh/zh/glossary/fullchain/) 文件和 [CA 证书包](https://ssl.sh/zh/glossary/ca-bundle/)就是这么来的；它也方便直接粘贴到宝塔面板、云厂商控制台的文本框里。很多部署问题其实出在粘贴环节：多了空格、少了横线，或者把私钥和证书贴反了。理解了"PEM 只是 DER 外面包了一层"，格式转换就不再神秘。

## 例子
```text
-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIUJ3...（Base64，每行 64 个字符）...
-----END CERTIFICATE-----
```

```bash
openssl x509 -in example.com.pem -outform DER -out example.com.der
```

## 常见误区
- **PEM 是一种证书类型。** 它只是编码方式，同一张证书既可以存成 PEM 也可以存成 DER。
- **.pem 文件里一定是证书。** 也可能是私钥、CSR、证书链，或者几种混在一起。
- **粘贴时少几个字符无所谓。** 少了横线、BEGIN 行不完整或 Base64 内容缺字符，文件都会无法解析。

## 相关术语

- [DER](https://ssl.sh/zh/glossary/der/): DER 是 ASN.1 的二进制编码规则，保证每个值只有唯一一种字节表示，X.509 证书和密钥都以它为基础。
- [X.509](https://ssl.sh/zh/glossary/x509/): X.509 是 ITU-T 制定的公钥证书标准格式，其互联网配置规范 RFC 5280 规定了 TLS 所用证书的结构和验证方法。
- [CRT 文件](https://ssl.sh/zh/glossary/crt-file/): CRT 文件是存放 X.509 证书的 .crt 或 .cer 文件，内容可能是 PEM 文本，也可能是二进制 DER，取决于生成它的平台。
- [KEY 文件](https://ssl.sh/zh/glossary/key-file/): KEY 文件是按惯例存放私钥的 .key 文件，通常为 PEM 编码，但扩展名本身并不说明里面的具体格式。
- [fullchain](https://ssl.sh/zh/glossary/fullchain/): fullchain 是依次包含站点证书和中间证书的 PEM 文件，让客户端能把站点证书连到受信任的根证书。
- [CA Bundle](https://ssl.sh/zh/glossary/ca-bundle/): CA Bundle 是把多张 PEM 证书拼接在一起的文件，既可能是服务器要发送的中间证书链，也可能是客户端信任的根证书集合。
- [PKCS#12](https://ssl.sh/zh/glossary/pkcs12/): PKCS#12 是一种用口令保护的二进制容器格式，可以把私钥、证书和证书链打包进一个文件，扩展名通常是 .p12 或 .pfx。
