rea-reverse

X.509 证书在线解析

粘贴 PEM 证书或整条证书链,或者拖入 DER、CRT、CER、P7B 文件,查看全部字段和扩展、SHA-1 和 SHA-256 指纹、证书链顺序是否正确,以及每张证书今天是否还在有效期内。

证书不会离开你的浏览器. 解析在一个隔离框架里的 Web Worker 中本地完成,这个框架禁止联网;本页的其他脚本(包括广告)看不到框架里面的内容。AIA、CRL 和 OCSP 地址只作为文本显示,从不访问。 如何自己验证

在单独页面打开工具(无广告、无统计)

TLS 握手失败、App 的证书固定(pinning)校验不过、CA 发来一包证书时,第一步通常是弄清楚“这张证书里到底写了什么”。openssl x509 -noout -text 能回答,但得手边有 OpenSSL,得把文本存成文件,证书链里有几张就要跑几遍。另一个办法是贴到随便哪个网站上解析,就算是公开证书也不是好习惯,因为同一个输入框下次可能就贴进了私钥。

这个解析器完全在浏览器里运行。粘贴 PEM 文本(一张证书或整条链),或者拖入文件即可。

使用步骤

  1. 拿到文本形式的证书:复制 .pem 或 .crt 文件的内容,或者运行 openssl s_client -connect example.com:443 -showcerts </dev/null 并复制整段输出。PEM 块之外的文字会被忽略。
  2. 粘贴到上方的输入框,点“解析”;也可以把 DER、CRT、CER 或 P7B 文件拖到上方的拖放区。
  3. 先看证书链顺序的结论,再逐张看证书:有效期和剩余天数、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 或指纹。框架把事件交给本页,由本页发送。完整列表见隐私政策。
  • 不想要任何广告和统计?在单独页面打开解析器。

如何自己验证

  1. 打开浏览器开发者工具的 Network(网络) 面板,加载本页。发往 tools.rea-reverse.com 的请求就是框架:它的 HTML、样式、字体和脚本,以及 Worker 脚本 /_astro/cert-worker-*.js。发往 Google 域名的请求是本页的广告。
  2. 清空日志,然后粘贴一条证书链并解析。在过滤框里输入 domain:tools.rea-reverse.com:最多只会再出现一次 Worker 脚本 /_astro/cert-worker-*.js(为下一次运行准备的新 Worker),没有任何请求带着你的数据。广告请求可能还会继续,但它们来自本页,不带框架里的任何内容。
  3. 点开来自 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' 这条策略下。
  4. 检查隔离:在 Console(控制台) 里,上下文选 top,运行 document.getElementById('tool-frame').contentDocument,结果是 null;frames[0].document 会抛出 SecurityError。广告脚本拿到的也是这个结果。
  5. 或者先打开页面再断网,然后解析,照样能用。
  6. 和 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 请用签名证书指纹查看工具。

更新于

相关教程