术语表

DER (可辨别编码规则)

最后核实

定义

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

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

为什么重要

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

例子

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 文件。
  • BER 和 DER 可以混用。 有的解析器也能读 BER,但证书签名是对 DER 计算的,只有 DER 才可靠。

延伸阅读