证书解码器常用的时刻是这样的:上线前不久,灰度环境返回 SSL_ERROR_BAD_CERT_DOMAIN,手头只有一段 PEM。你想看 SAN 列表、到期时间和 SHA-256 指纹。openssl x509 -text 能显示这些,但会连同其他所有字段一起列出;专门的解码器把这几项放在最前面。

立即解码证书 →

PEM 证书里到底是什么

.pem 文件不过是 DER 二进制数据的 Base64 外壳。剥掉 -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE----- 这对标记,把中间内容 Base64 解码,得到的就是一段 ASN.1 编码的二进制结构——LDAP 消息、SNMP 报文、绝大多数公钥格式用的都是同一套编码。

顶层结构由 RFC 5280 固定:

Certificate ::= SEQUENCE {
    tbsCertificate       TBSCertificate,
    signatureAlgorithm   AlgorithmIdentifier,
    signatureValue       BIT STRING
}

tbsCertificate(“to be signed”,待签名内容)里装的是所有人类关心的字段——版本号、序列号、有效期、Subject、Issuer、Subject Public Key Info,以及 v3 扩展列表。signatureAlgorithm 和 signatureValue 则用来证明这段 TBS 字节是由对应 CA 签发的。

ZeroTool 解码器用一段几百行的纯 JavaScript ASN.1 解析器,完整在你的浏览器里走完这棵树。没有上传、没有服务端 OpenSSL、不需要 API key。一份你不太敢粘进 cert-tools-online.example 的 PEM,粘进这里是安全的。

读懂有效期

notBefore 和 notAfter 这两个时间戳用 UTCTime 编码(YYMMDDhhmmssZ,适用于 2050 之前的日期)或 GeneralizedTime 编码(YYYYMMDDhhmmssZ,适用于 2050 及之后)。RFC 5280 规定了这个切换点,以便两位数年份不至于歧义。

实际操作中,你只关心四种状态:

状态含义处理
有效(剩余 > 30 天)证书在有效期内、未进入续期窗口不必动作——但建议把到期时间纳入巡检看板
30 天内到期浏览器仍接受,但 ACME 和商业 CA 续期一般在这个窗口启动安排轮换
已过期浏览器直接拒绝;客户端会看到硬错误 NET::ERR_CERT_DATE_INVALID立即轮换;若过期时间很近,检查时钟漂移
尚未生效notBefore 在未来——时钟偏移或灰度发布检查服务器 NTP 与 CA 签发时间

解码器在状态标签里用颜色标出这几种状态,并写明剩余天数——一旦看到数字小于 30,后面的对话就变成”续期任务跑了没”。

Subject、Issuer 与 SAN——现代主机名匹配的真实规则

浏览器不会用 Subject 的 CN 匹配主机名,用的是 Subject Alternative Name(SAN)扩展。Chrome 从 58 版起不再回退到 CN,Apple 从 iOS 13 和 macOS 10.15 起要求名称写在 SAN 里。证书只有 CN=example.com 而没有 SAN 条目时,现在的浏览器会拒绝它。

所以解码证书时按这个顺序读:

  1. SAN——这张证书实际覆盖哪些主机名?
  2. Subject——CN 是否一致?(主要给人看;CA 习惯仍然填它。)
  3. Issuer——谁签发的?(据此判断该看到 Let’s Encrypt 的中间证书,比如 R10 或 E5,还是 DigiCert、ZeroSSL 等。)

今天典型的 Let’s Encrypt 证书,SAN 里会同时有裸域名(example.com)和 www 子域。通配符证书的 SAN 是 *.example.com,而不是 CN。解码器按类型(DNS、IP、URI、email)对 SAN 条目分组,让你能快速看出错发的通配符证书。

Key Usage 和 Extended Key Usage 是”许可证”

Key Usage 扩展是一段 9 位的 BIT STRING,声明这张证书的公钥被允许做什么。Extended Key Usage(EKU)在 Key Usage 之上,用 serverAuth、codeSigning 这种意图级别的标识细化授权。

一张 TLS 服务器证书的典型组合:

Key Usage: digitalSignature, keyEncipherment
EKU      : serverAuth (some certificates also carry clientAuth)

CA 证书(中间证书或根证书)的典型组合:

Key Usage: keyCertSign, cRLSign
Basic Constraints: CA = true

如果一张叶子证书出现了 keyCertSign,说明出问题了——这个 bit 等于授予它再签发其他证书的权力,只有中间证书才该拥有。解码器把 KU 和 EKU 渲染成可读的小标签,让你一眼扫完。

指纹:不同 hash 对应不同用途

解码器里的指纹是对完整 DER 字节(不是 PEM 文本、也不是单独的公钥)计算的 SHA-256、SHA-1 和 MD5 摘要。它们不在证书内容里——CA 从未签过它们——但它们是识别一份具体证书最便宜的方式。

Hash2026 年的实际用途
SHA-256默认标识;openssl x509 -fingerprint -sha256 输出的就是它,现在的大多数工具和资产清单记录的也是它。
SHA-1老工具:旧的监控脚本、未迁移的 CMDB 内表、部分 IDS/IPS 签名库。新场景的 pinning 不要再用。
MD5兼容很老的 openssl 输出。密码学上已破,仅作只读对照。

要标识一个证书文件,用 SHA-256 那一行。证书锁定通常锁的是公钥(SPKI)的 SHA-256 哈希,不是整张证书,这样用同一把密钥续期时锁定仍然有效;解码器也会给出这个 SPKI 哈希(Base64,即 RFC 7469 的 pin-sha256 格式)。如果是在日志里查别人记下的哈希,解码器同时给出三种指纹,不用猜是哪一种。

RSA、ECDSA 与 Ed25519——公钥字段告诉你什么

Subject Public Key Info 段先给出算法 OID,再带原始公钥字节。当下你会遇到的三种现代形态:

1.2.840.113549.1.1.1  rsaEncryption          (经典 RSA)
1.2.840.10045.2.1     id-ecPublicKey         (基于命名曲线的 ECDSA)
1.3.101.112           id-Ed25519             (基于 edwards25519 的 EdDSA)

RSA 的公钥字节本身又是一个 ASN.1 SEQUENCE { modulus, exponent }。解码器会输出 modulus 的位长——2048 是可接受的,3072 更推荐,4096 是根 CA 区间。2026 年再看到 1024 位 RSA 就是一个 finding:浏览器大约从 2014 年起就停止接受。

ECDSA 会显示命名曲线 OID。实操中常见的三种:

  • prime256v1(又称 P-256 或 secp256r1)——Certbot 2.0 起默认生成的 ECDSA 密钥曲线
  • secp384r1(P-384)——部分 EV 证书和 Windows 端偏好
  • secp521r1(P-521)——线上罕见,主要是内部合规场景

Ed25519 证书目前不用于公网 TLS,因为 CA/浏览器论坛的 Baseline Requirements 只允许公开信任的 TLS 证书使用 RSA 和 ECDSA 密钥;它们出现在私有 PKI 和内部服务网格 TLS 中。解码器按 OID 标注它们,不用你去记。

Bundle 文件与解码器的处理范围

PEM bundle 就是把多个 -----BEGIN CERTIFICATE----- 块前后拼起来。服务器在交付 leaf + 中间 + 根作为完整证书链时会出现这种文件,或者 CA 直接打包成 fullchain.pem。

ZeroTool 解码器会解析输入里的每一张证书,并检查证书链:每张证书后面是否紧跟签发它的证书,签名能否用下一张证书的公钥验证。点列表里的证书即可查看详情。工具没有信任库,是否受信任仍请用本地 openssl verify -CAfile chain.pem cert.pem 判断。

解码结果里值得警觉的几种信号

运维 review 时下面这些模式值得标红:

  • 公网 TLS 叶证书的有效期超过当前上限。 CA/浏览器论坛的 Baseline Requirements 自 2020 年 9 月起把公网 TLS 证书限制在 398 天,SC-081 号投票又规定 2026 年 3 月 15 日起签发的证书不超过 200 天。比这更长,说明是非公共 CA、配置有误的私有 PKI,或者是旧证书。
  • CN 有值但 SAN 缺失。前面提过,浏览器一律拒绝——对发现还在用 legacy 内部 CA 流程、即将打破新部署的环境特别有用。
  • 服务器证书带 CA = true。要么是错发,要么你看的其实是中间证书但被误认为 leaf。
  • AIA 里有 OCSP URL,但没标 OCSP Must-Staple。大多数部署没问题,但如果环境要求强制 stapling,签发时需要带上 OCSP Must-Staple 扩展(OID 1.3.6.1.5.5.7.1.24)。

与 openssl x509 -text 的关系

openssl x509 -in cert.pem -noout -text
openssl x509 -in cert.pem -noout -fingerprint -sha256
openssl x509 -in cert.pem -noout -dates -subject -issuer -ext subjectAltName

openssl 完备、可脚本化;ZeroTool 解码器在排障时回答”这张证书到底是什么”更快。它们互补,不是替代——openssl 跑流水线,解码器对付”现在群里就甩了一段 PEM,赶紧看”的场景。

一个运维更在意的隐私角度

把生产证书粘进陌生在线工具是一次软泄露:虽然证书本身是公开信息、任何 TLS 客户端都能拿到,但粘贴这个动作告诉对方的服务器——你们公司有人正在那一刻调试这张证书。某些合规框架会在审计日志里标记这种行为。

ZeroTool 解码器在浏览器标签页里运行:PEM 不会发往任何地方。页面本身和站内其他页面一样会加载统计和广告脚本,但这些请求都不带证书内容。可以打开 DevTools → Network,粘贴 PEM 并解码,确认没有新的请求包含它。

延伸阅读