2. 证书格式解析:DER 与 PEM 格式区别、如何查看证书内容

说到证书格式,我见过不少运维同事在这上面栽跟头。明明证书内容是对的,就是加载失败。最后发现——格式搞错了。今天咱们就把 DER 和 PEM 这两个老冤家彻底说清楚。

2.1 DER 与 PEM:一个二进制,一个文本

先给个最直观的结论:DER 是二进制格式,PEM 是 Base64 编码的文本格式。你想想看,一个证书文件用记事本打开,如果全是乱码,那八成是 DER;如果能看见一串以 -----BEGIN CERTIFICATE----- 开头的字符,那就是 PEM。

对比项 DER PEM
编码方式 二进制(ASN.1 DER 编码) Base64 + 头尾标记行
文件扩展名 .der / .cer / .crt .pem / .crt / .cer / .key
可读性 不可直接阅读 可用文本编辑器查看
传输友好度 低(含不可见字符) 高(纯文本,可复制粘贴)
常见场景 Windows 系统、Java 密钥库 OpenSSL、Nginx、Apache、Linux 环境

我个人习惯:只要不是必须用 DER 的场景,一律用 PEM。为什么?因为调试方便。你拿眼睛一看就知道证书有没有过期,签发者是谁。DER 你只能靠命令去解析。

核心记忆点:

  • PEM = 文本外壳 + Base64 内容
  • DER = 纯二进制,ASN.1 序列化
  • 两者可以无损互转

2.2 如何用 OpenSSL 查看证书内容

说到查看证书,openssl x509 是我最常用的命令,没有之一。它就像一个证书的「CT 扫描仪」,能把证书的每个字段都给你拆开看。

2.2.1 查看 PEM 格式证书

openssl x509 -in cert.pem -text -noout

这条命令会输出证书的完整信息,包括:

  • 证书版本(V1/V2/V3)
  • 序列号
  • 签名算法
  • 签发者(Issuer)
  • 有效期(Not Before / Not After)
  • 主体(Subject)
  • 公钥信息
  • 扩展字段(SAN、Key Usage 等)

嗯,这里要注意:-noout 参数的意思是「不输出证书本体」,只输出解析后的文本。如果你不加它,终端会先打印一遍 Base64 的证书内容,再打印解析结果,看着很乱。

2.2.2 查看 DER 格式证书

DER 格式不能直接喂给 openssl x509,需要加一个 -inform DER 参数:

openssl x509 -in cert.der -inform DER -text -noout

我在项目中遇到过好几次这种情况:从 Windows 导出的证书是 .cer 文件,默认是 DER 格式。直接扔到 Linux 上用 openssl x509 查看,报错 unable to load certificate。其实就是没加 -inform DER。

小技巧: 如果你不确定一个证书文件是 DER 还是 PEM,可以用 file 命令先看一眼:

file cert.cer
# 输出示例:
# cert.cer: PEM certificate
# 或
# cert.cer: data  (这就是 DER)

2.3 DER 与 PEM 互转

说实话,互转是日常运维的高频操作。我建议你把这几个命令记在笔记里,用的时候直接复制。

转换方向 命令
PEM → DER openssl x509 -in cert.pem -outform DER -out cert.der
DER → PEM openssl x509 -in cert.der -inform DER -out cert.pem

举个例子,有一次客户发给我一个 .cer 文件,说是从 CA 官网下载的。我用 file 一看是 DER 格式,但我们的 Nginx 只认 PEM。一行命令就搞定了:

openssl x509 -in certificate.cer -inform DER -out certificate.pem

避坑指南: 我曾经遇到过一个问题——DER 转 PEM 后,文件内容看起来正常,但 Nginx 启动报错。后来发现是证书文件末尾多了一个空行。PEM 格式对头尾标记和空行非常敏感。建议转换后用 openssl x509 -in cert.pem -text -noout 验证一下,能正常解析才算成功。

2.4 只看关键字段:快速定位问题

有时候你不需要看全部信息,只想确认某个字段。比如排查证书链问题时,最常看的就是签发者和有效期。

查看签发者和主体

openssl x509 -in cert.pem -noout -issuer -subject

输出示例:

issuer= /C=CN/O=Example CA/CN=Example Root CA
subject= /C=CN/O=Example Inc./CN=www.example.com

查看有效期

openssl x509 -in cert.pem -noout -dates

输出示例:

notBefore=Jan  1 00:00:00 2024 GMT
notAfter=Dec 31 23:59:59 2024 GMT

查看证书指纹(SHA256)

openssl x509 -in cert.pem -noout -fingerprint -sha256

这个在验证证书是否被篡改时非常有用。我一般会在部署前后各算一次指纹,对比一下,确保传输过程中没被改过。

2.5 一张图看懂证书格式与查看流程

下面这张图总结了我平时排查证书格式问题的思路,你可以照着走一遍:

证书格式解析与查看流程 证书格式解析与查看流程 拿到一个证书文件 用 file 命令或记事本判断格式 DER 格式 PEM 格式 openssl x509 -in cert.der -inform DER -text -noout openssl x509 -in cert.pem -text -noout 输出证书全部字段信息 💡 关键字段:Issuer / Subject / Validity / Public Key / SAN / Key Usage

2.6 常见问题与避坑

最后分享几个我踩过的坑,希望能帮你省点时间。

坑一:PEM 文件包含多个证书

证书链文件(如 fullchain.pem)通常包含多个 PEM 证书,一个接一个。用 openssl x509 默认只解析第一个。想看第二个?需要先把它们拆开,或者用 openssl crl2pkcs7 这类工具处理。

坑二:Windows 下的换行符问题

我曾经在 Windows 上用记事本编辑过 PEM 文件,保存后传到 Linux 服务器上,OpenSSL 报错 bad decrypt。原因是 Windows 的换行符是 \r\n,而 Linux 下 OpenSSL 只认 \n。解决方案:用 dos2unix 转换一下。

我的习惯: 每次拿到证书文件,第一件事就是跑一遍 openssl x509 -in file -text -noout(DER 记得加 -inform DER)。能正常输出,说明格式没问题;报错,那就先解决格式问题。这个习惯帮我省了至少 80% 的证书排查时间。