通配符证书还有半小时上线,灰度环境正在抛 SSL_ERROR_BAD_CERT_DOMAIN,而终端 scrollback 里只剩下一段 PEM。你想在发布窗口关闭前确认 SAN 列表、过期时间和 SHA-256 指纹。openssl x509 -text 当然可以做到,但敲完五个 flag 你还在滚屏找那一个真正关心的字段。这种时候,一个聚焦的解码器更快。

立即解码证书 →

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 扩展列表。signatureAlgorithmsignatureValue 则用来证明这段 TBS 字节是由对应 CA 签发的。

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

读懂有效期

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

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

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

解码器会用颜色直接标出这几种状态。运维最先扫一眼的就是 Days Left 那一行——一旦看到数字小于 30,后面的对话就变成”续期任务跑了没”。

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

2026 年的浏览器在做主机名匹配时,不看 Subject CN,只看 Subject Alternative Name(SAN)扩展。Chrome 在 58 版去掉了 CN 回退,Firefox 在 48 版,Safari 在 iOS 13。如果证书是 CN=example.com 但没写 SAN,主流浏览器一律拒绝。

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

  1. SAN——这张证书实际覆盖哪些主机名?
  2. Subject——CN 是否一致?(主要给人看;CA 习惯仍然填它。)
  3. Issuer——谁签的?(告诉你预期对接的是 Let’s Encrypt R3、DigiCert Global Root、ZeroSSL,还是企业内部 CA。)

今天典型的 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 之上,用 serverAuthcodeSigning 这种意图级别的标识细化授权。

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

Key Usage: digitalSignature, keyEncipherment
EKU      : serverAuth, 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当下的默认标识。HSTS preload 申请、移动端证书 pinning、部分标准的 SRI、openssl x509 -fingerprint -sha256 全部用它。
SHA-1老工具:旧的监控脚本、未迁移的 CMDB 内表、部分 IDS/IPS 签名库。新场景的 pinning 不要再用。
MD5兼容很老的 openssl 输出。密码学上已破,仅作只读对照。

要做 pinning,复制 SHA-256 那一行。要在某条日志里 grep 别人写下的 hash,解码器把三种都给出,你不必猜对方用的是哪种。

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-256secp256r1)——Let’s Encrypt ECDSA 证书链的默认
  • secp384r1P-384)——部分 EV 证书和 Windows 端偏好
  • secp521r1P-521)——线上罕见,主要是内部合规场景

Ed25519 证书在公开 web TLS 上仍不算常见(Chrome 从 109 版才支持),但在内部 mesh TLS、代码签名和 SSH 上能看到。解码器按 OID 标注,你不必背 hex。

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

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

ZeroTool 解码器只解析输入里的第一张证书,会在状态条提示一共看到了几张。想看其他位置,只粘贴那一段。跨证书的签名验证不在工具范围内——这种需求请用本地 openssl verify -CAfile chain.pem cert.pem

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

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

  • 公开 TLS 叶子证书的 notAfternotBefore 超过 13 个月。自 2020 年 9 月起,Apple、Mozilla、Google 同步把公开 TLS 寿命上限设为 398 天。超过这个数字,要么是非公开 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 解码器完全在浏览器 tab 内运行。PEM 不会到达任何服务器——首屏加载之后再无网络请求。打开 DevTools → Network,粘贴一张 PEM,点 Decode,确认请求计数没有变化,自己就能验证。

延伸阅读