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 一张图看懂证书格式与查看流程
下面这张图总结了我平时排查证书格式问题的思路,你可以照着走一遍:
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% 的证书排查时间。