TLS 握手失败、App 的证书固定(pinning)校验不过、CA 发来一包证书时,第一步通常是弄清楚“这张证书里到底写了什么”。openssl x509 -noout -text 能回答,但得手边有 OpenSSL,得把文本存成文件,证书链里有几张就要跑几遍。另一个办法是贴到随便哪个网站上解析,就算是公开证书也不是好习惯,因为同一个输入框下次可能就贴进了私钥。
这个解析器完全在浏览器里运行。粘贴 PEM 文本(一张证书或整条链),或者拖入文件即可。
能读什么
- PEM:任意数量的
-----BEGIN CERTIFICATE-----块、TRUSTED CERTIFICATE(OpenSSL 带信任设置的变体)和PKCS7块。块外面的文字会被忽略,所以可以直接粘一段日志,或者openssl s_client -showcerts的整段输出。同一段文本里的私钥和 CSR 会被跳过,不会读取。去掉了首尾标记行的纯 Base64 也能解析。 - 文件:DER(
.der、.cer、.crt)、PEM 文件,以及 PKCS#7 / CMS 证书包(.p7b、.p7c)。密钥库和 APK 也能拖进来,不过签名证书指纹查看是专门为它们做的。
每张证书显示什么
- RFC 4514 格式的主体和颁发者(
CN=example.test,O=REA Fixtures\, Test,C=CN)、序列号、版本、签名算法,以及公钥(RSA 模长、P-256 / P-384 等 EC 曲线、Ed25519)。 - 有效期和今天的状态:有效(还剩多少天)、已过期,或尚未生效。
- 指纹:DER 编码的 SHA-1、SHA-256、MD5,分别给出冒号十六进制、纯十六进制和 Base64 三种写法,另外给出公钥 SHA-256 的 Base64(HPKP 和 Android 网络安全配置里的 pin 值)。
- 全部扩展,按证书里存放的顺序列出,关键扩展会标出来,解码后的文字使用 RFC 5280 里的名称:
- 主体备用名称 SAN(DNS、IPv4 和 IPv6、邮箱、URI、目录名、其他名称);
- 密钥用法、扩展密钥用法(
serverAuth、clientAuth、codeSigning等)、带路径长度的基本约束; - 主体密钥标识符和颁发机构密钥标识符;
- 颁发机构信息访问(OCSP 和 CA Issuers 地址)和 CRL 分发点,只显示文本,从不访问;
- 带 CA/浏览器论坛名称(DV、OV、EV)和 CPS 地址的证书策略、名称约束、TLS 特性(OCSP Must-Staple);
- 内嵌的证书透明度 SCT 列表:SCT 的数量,以及每条 SCT 的日志 ID 和时间戳。
- 其余扩展显示 OID 和十六进制值。
证书链顺序检查
有多张证书时,页面会逐条检查:第 n+1 张是不是第 n 张的颁发者?它逐字节比较颁发者名称和下一张的主体名称;两边都有密钥标识符时,再比较颁发机构密钥标识符和下一张的主体密钥标识符。服务器应该先发叶子证书,再依次发中间证书;部署时常见的错误是证书包顺序不对,或者把根证书放在了最前面,这项检查会把它标出来。它还会说明证书链是否以自签发的根证书结尾,服务器一般不需要发送根证书。
这是结构层面的检查:不验证签名,也不查询吊销状态(CRL、OCSP),因为那需要从你的浏览器去连接 CA。
我们怎么验证的
测试证书用 OpenSSL 4.0.3 生成:EC P-256 根证书、带 pathlen:0 的 EC P-384 中间证书,以及一张 RSA 2048 叶子证书,SAN 里有两个 DNS 名、一个 IPv4 和一个 IPv6 地址、一个邮箱和一个 URI,带两种 TLS 扩展密钥用法、AIA、CRL 分发点、DV 策略和两条 SCT;另外还有一张 2000 年的过期证书。单元测试把指纹、名称、日期、密钥长度、关键标志和上面每一项扩展都和 openssl x509 -text -fingerprint 的输出比对。OpenSSL 打印 IPv6 SAN 时不压缩(2001:DB8:0:0:0:0:0:1),这个页面按 RFC 5952 写成简写形式(2001:db8::1)。
数据怎么保证不外泄
- 解析在你设备上的 Web Worker 里进行,粘贴或拖入的内容都不会上传。
- 证书里的值都按纯文本显示,里面的 URL 不会变成链接,也从不请求。
- 统计事件只有粗粒度的值:成功或错误码、识别出的格式、证书数量区间、大小区间和耗时区间,不含名称、URL 或指纹。完整列表见隐私政策。
- 工具页不展示广告。
如何自己验证
- 打开浏览器开发者工具的 Network(网络) 面板,粘贴一条证书链并解析。能看到的请求只有页面资源和 Worker 脚本
/_astro/cert-worker-*.js。 - 或者先打开页面再断网,然后解析,照样能用。
- Worker 运行在
default-src 'none'; script-src 'self'; connect-src 'none'这条内容安全策略下。 - 和
openssl x509 -in cert.pem -noout -text -fingerprint -sha256的输出对照。
局限
- 不验证签名、不查吊销、不对照信任库:“顺序正确”不等于“可信”。
- 支持 DER,也支持不定长的 BER 编码(
openssl cms -stream写出的 PKCS#7 / CMS 文件就是这样)。指纹按文件里存的原始字节计算。 - 少见的扩展(策略映射、策略约束、主体目录属性、合格证书声明)以十六进制显示。
- 不解析证书请求(CSR)、CRL 和 OCSP 响应。
相关教程
- X.509 证书怎么看:解析 PEM、检查证书链顺序:本解析器与
openssl x509 -text、openssl verify对照,用自建证书链和 letsencrypt.org 的证书链实测。 - 用 REA 和 HAR 抓包追踪网站的接口调用
- HAR 文件分析指南
- 用 REA 分析 Android APK:JADX、Apktool、ADB:App 里的证书固定