# DER（可辨别编码规则）是什么？定义、例子与常见误区

> DER 是 ASN.1 的二进制编码规则，保证每个值只有唯一一种字节表示，X.509 证书和密钥都以它为基础。

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

DER（Distinguished Encoding Rules）来自 ITU-T X.690，用来把 ASN.1 数据结构编码成字节。它是 BER（基本编码规则）的严格子集，去掉了所有可选写法，同一个值永远编码成完全相同的字节。这一点对密码学至关重要：[X.509](https://ssl.sh/zh/glossary/x509/) 证书的签名是针对其 DER 编码计算的，换一种编码签名就对不上了。扩展名为 .der 或 .cer 的文件常常就是原始 DER，而 [PEM](https://ssl.sh/zh/glossary/pem/) 文件只不过是把 DER 做了 Base64 编码再加上文本头尾。

## 为什么重要
凡是偏好二进制的地方都能见到 DER：Windows 证书导出、Java 和 Android 工具链、智能卡，以及 TLS 协议本身，握手中传输的证书就是 DER 格式。证书指纹也是对 DER 字节计算的哈希。如果某个工具拒绝一个用文本编辑器打开像乱码的证书文件，它多半是 DER，需要显式指定输入格式，或者先转换成 PEM。在 Windows 证书导出向导里选择"DER 编码二进制 X.509"，得到的就是这种文件。

## 例子
```bash
openssl x509 -in example.com.der -inform DER -noout -subject
openssl x509 -in example.com.der -inform DER -out example.com.pem   # DER 转 PEM
openssl asn1parse -in example.com.der -inform DER | head -5
```

## 常见误区
- **DER 证书和 PEM 证书是两张不同的证书。** 数据完全相同，只是编码不同，转换后指纹不变。
- **一个 DER 文件可以放整条证书链。** DER 文件通常只放一个对象，证书链要用 PEM 证书包或 [PKCS#7](https://ssl.sh/zh/glossary/pkcs7/) 文件。
- **BER 和 DER 可以混用。** 有的解析器也能读 BER，但证书签名是对 DER 计算的，只有 DER 才可靠。

## 相关术语

- [PEM](https://ssl.sh/zh/glossary/pem/): PEM 是一种把 DER 二进制数据做 Base64 编码、再用 BEGIN 和 END 行包起来的文本格式，是存放证书和私钥最常见的方式。
- [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，取决于生成它的平台。
- [PKCS#7](https://ssl.sh/zh/glossary/pkcs7/): PKCS#7 是一种用于签名和加密数据的格式，在 .p7b 或 .p7c 文件中常用来打包一组证书，不含私钥。
- [PKCS#12](https://ssl.sh/zh/glossary/pkcs12/): PKCS#12 是一种用口令保护的二进制容器格式，可以把私钥、证书和证书链打包进一个文件，扩展名通常是 .p12 或 .pfx。
- [KEY 文件](https://ssl.sh/zh/glossary/key-file/): KEY 文件是按惯例存放私钥的 .key 文件，通常为 PEM 编码，但扩展名本身并不说明里面的具体格式。
- [证书指纹](https://ssl.sh/zh/glossary/certificate-fingerprint/): 证书指纹是对证书 DER 编码计算出的哈希值（通常用 SHA-256），用来唯一标识一张证书，它本身并不存储在证书里。
