TLS 握手失败、App 的证书固定(pinning)校验不过、CA 发来一包证书时,第一步通常是弄清楚“这张证书里到底写了什么”。openssl x509 -noout -text 能回答,但得手边有 OpenSSL,得把文本存成文件,证书链里有几张就要跑几遍。另一个办法是贴到随便哪个网站上解析,就算是公开证书也不是好习惯,因为同一个输入框下次可能就贴进了私钥。
这个解析器完全在浏览器里运行。粘贴 PEM 文本(一张证书或整条链),或者拖入文件即可。
使用步骤
- 拿到文本形式的证书:复制
.pem或.crt文件的内容,或者运行openssl s_client -connect example.com:443 -showcerts </dev/null并复制整段输出。PEM 块之外的文字会被忽略。 - 粘贴到上方的输入框,点“解析”;也可以把 DER、CRT、CER 或 P7B 文件拖到上方的拖放区。
- 先看证书链顺序的结论,再逐张看证书:有效期和剩余天数、SAN、密钥用法、各项扩展,以及可直接复制的指纹。
真实输出示例
我们用 openssl s_client -showcerts 取回本站实际发送的证书链,把整段输出粘贴到本页,再把页面显示的结果复制下来。排版做了压缩(标签和值放在同一行,省去复制按钮和 MD5/SHA-1 行),所有值都原样保留。剩余天数按抓取当天计算。
样本: rea-reverse.com 在 2026-11-02 发送的证书链(叶子证书、WE1 中间证书、由 GlobalSign Root CA 交叉签发的 GTS Root R4)
概览
格式 PEM 文本
内容 3 张证书
顺序正确 每张证书后面紧跟的都是它的颁发者证书。
1 → 2: 颁发者名称一致; 密钥标识符一致
2 → 3: 颁发者名称一致; 密钥标识符一致
证书链没有以根证书结尾。服务器证书链通常就是这样,根证书由客户端自带。
只比对名称和密钥标识符,不验证签名。
证书 1/3: rea-reverse.com
主体(Subject) CN=rea-reverse.com
颁发者(Issuer) CN=WE1,O=Google Trust Services,C=US
有效期 2026-10-13 03:42:33 UTC → 2027-01-11 04:42:30 UTC 有效 还剩 70 天
公钥 EC · P-256 · 256 bit
签名算法 ecdsa-with-SHA256
序列号 bef274d13a80aca91337a3e08675df34
版本 v3
主体备用名称(SAN) DNS:rea-reverse.com
公钥固定值(SHA-256,Base64) Ej22GtttxQhRqyu0lyyRuNnzo3Ekzq/8F4JCeIqfqHE=
SHA-256 F3:42:50:7F:DD:6D:DD:7B:01:64:32:F0:EB:D0:F0:A9:18:B9:4D:CB:34:69:0C:99:1E:24:08:C7:E2:0C:5F:CB
扩展(10)
keyUsage 关键 digitalSignature
extKeyUsage serverAuth
basicConstraints 关键 CA:FALSE
subjectKeyIdentifier C6:6E:81:9F:57:37:66:61:4B:61:D6:F7:B4:BD:D5:27:E7:42:57:F1
authorityKeyIdentifier keyid:90:77:92:35:67:C4:FF:A8:CC:A9:E6:7B:D9:80:79:7B:CC:93:F9:38
authorityInfoAccess CA Issuers - URI:http://i.pki.goog/we1.crt
subjectAltName DNS:rea-reverse.com
certificatePolicies Policy: 2.23.140.1.2.1 (DV)
cRLDistributionPoints Full Name: URI:http://c.pki.goog/we1/zyDMiYzGO48.crl
ctSignedCertificateTimestamps
v1 log WW5sM4aUsllyolbIoOjdkEp26Ag92oc7AQg4KBQ87lk= at 2026-10-13T04:42:33.953Z
v1 log YEyar3p/d18B1Ab8kg3ImesLHH34yVIb+voXdzuXi8k= at 2026-10-13T04:42:34.019Z
证书 2/3: WE1
主体(Subject) CN=WE1,O=Google Trust Services,C=US
颁发者(Issuer) CN=GTS Root R4,O=Google Trust Services LLC,C=US
有效期 2023-12-13 09:00:00 UTC → 2029-02-20 14:00:00 UTC 有效 还剩 841 天
…
basicConstraints 关键 CA:TRUE, pathlen:0
…
证书 3/3: GTS Root R4
主体(Subject) CN=GTS Root R4,O=Google Trust Services LLC,C=US
颁发者(Issuer) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE
有效期 2023-11-15 03:43:21 UTC → 2028-01-28 00:00:42 UTC 有效 还剩 451 天
公钥 EC · P-384 · 384 bit
签名算法 sha256WithRSAEncryption
…能读什么
- 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)。
数据怎么保证不外泄
- 解析器运行在一个单独的框架(iframe)里,来源是
tools.rea-reverse.com;解析在框架里的 Web Worker 中、在你的设备上完成。粘贴或拖入的内容都不会上传。 - 这个页面在正文下方展示一个广告。广告脚本运行在
rea-reverse.com上,而框架属于另一个源(origin),浏览器不允许广告脚本或本页的任何其他脚本读取你粘贴的内容、拖入的文件或解析结果。 - 框架的内容安全策略拦截它的脚本能发起的所有请求(
connect-src 'none',也不加载任何第三方资源),框架也不能自行打开窗口或让本页跳转。它传给本页的只有自身高度和下面这些统计事件。 - 证书里的值都按纯文本显示,里面的 URL 不会变成链接,也从不请求。
- 统计事件只有粗粒度的值:成功或错误码、识别出的格式、证书数量区间、大小区间和耗时区间,不含名称、URL 或指纹。框架把事件交给本页,由本页发送。完整列表见隐私政策。
- 不想要任何广告和统计?在单独页面打开解析器。
如何自己验证
- 打开浏览器开发者工具的 Network(网络) 面板,加载本页。发往
tools.rea-reverse.com的请求就是框架:它的 HTML、样式、字体和脚本,以及 Worker 脚本/_astro/cert-worker-*.js。发往 Google 域名的请求是本页的广告。 - 清空日志,然后粘贴一条证书链并解析。在过滤框里输入
domain:tools.rea-reverse.com:最多只会再出现一次 Worker 脚本/_astro/cert-worker-*.js(为下一次运行准备的新 Worker),没有任何请求带着你的数据。广告请求可能还会继续,但它们来自本页,不带框架里的任何内容。 - 点开来自
tools.rea-reverse.com的x509-certificate-decoder/文档,查看 Headers:它的Content-Security-Policy里有connect-src 'none'和frame-ancestors https://rea-reverse.com。在 Chrome 里,Application(应用)> Frames 也能看到框架的源和策略。Worker 运行在default-src 'none'; script-src 'self'; connect-src 'none'这条策略下。 - 检查隔离:在 Console(控制台) 里,上下文选
top,运行document.getElementById('tool-frame').contentDocument,结果是null;frames[0].document会抛出SecurityError。广告脚本拿到的也是这个结果。 - 或者先打开页面再断网,然后解析,照样能用。
- 和
openssl x509 -in cert.pem -noout -text -fingerprint -sha256的输出对照。
局限
- 不验证签名、不查吊销、不对照信任库:“顺序正确”不等于“可信”。
- 支持 DER,也支持不定长的 BER 编码(
openssl cms -stream写出的 PKCS#7 / CMS 文件就是这样)。指纹按文件里存的原始字节计算。 - 少见的扩展(策略映射、策略约束、主体目录属性、合格证书声明)以十六进制显示。
- 不解析证书请求(CSR)、CRL 和 OCSP 响应。
对应的命令行
取得服务器发送的证书链(OpenSSL 4.0.3,只保留证书链摘要):
$ openssl s_client -connect rea-reverse.com:443 -servername rea-reverse.com -showcerts </dev/null
…
Certificate chain
0 s:CN=rea-reverse.com
i:C=US, O=Google Trust Services, CN=WE1
a:PKEY: EC, (prime256v1); sigalg: ecdsa-with-SHA256
v:NotBefore: Oct 13 03:42:33 2026 GMT; NotAfter: Jan 11 04:42:30 2027 GMT
1 s:C=US, O=Google Trust Services, CN=WE1
i:C=US, O=Google Trust Services LLC, CN=GTS Root R4
a:PKEY: EC, (prime256v1); sigalg: ecdsa-with-SHA384
v:NotBefore: Dec 13 09:00:00 2023 GMT; NotAfter: Feb 20 14:00:00 2029 GMT
2 s:C=US, O=Google Trust Services LLC, CN=GTS Root R4
i:C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA
a:PKEY: EC, (secp384r1); sigalg: sha256WithRSAEncryption
v:NotBefore: Nov 15 03:43:21 2023 GMT; NotAfter: Jan 28 00:00:42 2028 GMT
…
Verification: OK把其中的 -----BEGIN CERTIFICATE----- 块存成 chain.pem。openssl x509 只读文件里的第一张证书,也就是叶子证书:
$ openssl x509 -in chain.pem -noout -subject -issuer -dates -ext subjectAltName,keyUsage,extendedKeyUsage,basicConstraints
subject=CN=rea-reverse.com
issuer=C=US, O=Google Trust Services, CN=WE1
notBefore=Oct 13 03:42:33 2026 GMT
notAfter=Jan 11 04:42:30 2027 GMT
X509v3 Key Usage: critical
Digital Signature
X509v3 Extended Key Usage:
TLS Web Server Authentication
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Subject Alternative Name:
DNS:rea-reverse.com$ openssl x509 -in chain.pem -noout -fingerprint -sha256
sha256 Fingerprint=F3:42:50:7F:DD:6D:DD:7B:01:64:32:F0:EB:D0:F0:A9:18:B9:4D:CB:34:69:0C:99:1E:24:08:C7:E2:0C:5F:CB公钥固定值(SubjectPublicKeyInfo 的 SHA-256,Base64 编码):
$ openssl x509 -in chain.pem -noout -pubkey | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64
Ej22GtttxQhRqyu0lyyRuNnzo3Ekzq/8F4JCeIqfqHE=按文件顺序列出每张证书的主体和颁发者,用肉眼核对证书链顺序:
$ openssl crl2pkcs7 -nocrl -certfile chain.pem | openssl pkcs7 -print_certs -noout
subject=CN=rea-reverse.com
issuer=C=US, O=Google Trust Services, CN=WE1
subject=C=US, O=Google Trust Services, CN=WE1
issuer=C=US, O=Google Trust Services LLC, CN=GTS Root R4
subject=C=US, O=Google Trust Services LLC, CN=GTS Root R4
issuer=C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA本页不做的签名验证和信任库校验,再多一条命令即可:
$ openssl verify -untrusted chain.pem chain.pem
chain.pem: OK常见问题
怎样在不上传的情况下解析 PEM 证书?
直接粘贴到本页。解析在浏览器的 Web Worker 里进行,这个 Worker 没有任何网络权限,证书不会被发往任何地方。离线时,openssl x509 -in cert.pem -noout -text 能打印同样的字段。
怎样检查证书链的顺序对不对?
粘贴整条证书链,例如 openssl s_client -showcerts 的输出。页面会检查每张证书后面是否紧跟它的颁发者:比较颁发者名称和下一张的主体名称,以及颁发机构密钥标识符和下一张的主体密钥标识符。服务器应该先发叶子证书,再依次发中间证书。
显示“顺序正确”是不是就说明证书链可信?
不是。这只是结构检查:不验证签名、不查吊销状态,也不对照信任库。签名和信任校验请运行 openssl verify -untrusted chain.pem leaf.pem。
为什么服务器的证书链最后没有根证书?
客户端的信任库里已经有根证书,服务器通常不发送它。上面 rea-reverse.com 的证书链里,最后一张是由 GlobalSign Root CA 颁发的 GTS Root R4:它是交叉签发的副本,不是自签名的根证书。
SHA-256 指纹和公钥固定值在哪里看?
每张证书都有“指纹”一栏,列出 SHA-1、SHA-256 和 MD5 的冒号十六进制、纯十六进制和 Base64 写法;“公钥固定值”一行是公钥的 SHA-256 Base64,Android 网络安全配置等证书固定设置要的就是这个值。
能打开 DER、CRT、CER 或 P7B 文件吗?
可以。把文件拖到页面上的拖放区即可:这些扩展名的 DER 和 PEM 文件,以及 PKCS#7 证书包(.p7b、.p7c)都能读取。密钥库和 APK 请用签名证书指纹查看工具。
更新于
相关教程
- X.509 证书怎么看:解析 PEM、检查证书链顺序:本解析器与
openssl x509 -text、openssl verify对照,用自建证书链和 letsencrypt.org 的证书链实测。 - HAR 文件分析指南
- 用 REA 分析 Android APK:JADX、Apktool、ADB:App 里的证书固定