⌘K 切换工具
SECURITY

SSL 证书与 CSR 内容查看

在浏览器内查看 SSL 证书或 CSR 的内容,不上传任何数据。

local
cert-viewer

🖥 Reads an X.509 certificate or a PKCS#10 CSR entirely in your browser. Nothing is uploaded. A private key is refused rather than displayed.

§01 关于此工具

概述

证书是一组以 DER(一种二进制编码)表示的已签名声明,为便于传输再用 Base64 包装。 实务中证书出的所有问题都能在这些声明里看到:SAN 列表里缺失的名称、比预期更早结束的 有效期、被贴到叶证书位置的中间证书、禁止了购买时所需用途的密钥用途。

本查看器解码 PEM、解析 DER 并把内容铺开——X.509 证书与 PKCS#10 证书请求均支持。 这一切在您的浏览器内完成,并且直接拒绝私钥。

使用方法

  1. 粘贴以 -----BEGIN CERTIFICATE----------BEGIN CERTIFICATE REQUEST----- 开头的 PEM 区块。
  2. 阅读摘要:类型、主体、颁发者、有效期、剩余天数。
  3. 将 SAN 列表与您预期要提供服务的主机名逐一核对。

从服务器取得实际使用的证书: openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509

只有主体备用名称有效

主体的 Common Name 看起来像是证书的名称,而在主机名验证中它并不被使用。Chrome 自 58 版起忽略它,其他浏览器随后跟进。真正被查阅的只有 subjectAltName 扩展。

实务上的后果:

  • 主机名出现在 CN 中的证书,在现行的所有浏览器中都会验证失败,同时在任何把主体 放在显眼位置显示的工具里看起来完全正确。
  • 通配符 *.example.com 只匹配一级标签。它覆盖 www.example.com,不覆盖 a.b.example.com,也不覆盖裸的 example.com——后者需要自己的 SAN 条目,因此证书 通常会把两者一起列出。
  • SAN 是有类型的。dNSNameiPAddressrfc822NameURI 条目都会显示,而放进 错误类型里的主机名不会匹配。

密钥及其用途的读法

密钥算法与长度从公钥结构中读取。对 RSA 而言,模数长度直接给出位长。对 EC 而言,使用 命名曲线时会报告曲线名;证书携带显式参数而非曲线名时会如实说明——显式参数会被多数 现代 TLS 栈拒绝,因此看得见是有价值的。没有曲线名时,长度由公钥点的长度推导,这就是 P-521 密钥报告为 521 而不是按字节数简单换算得到的 528 的原因。

keyUsageextendedKeyUsage 描述密钥被允许做什么,两者都会被强制执行。EKU 中不含 serverAuth 的证书,即使其他一切正确也无法用于 TLS——把客户端证书误装到服务器上时 常见的结果。

basicConstraints 说明该证书是否为 CA。如果您粘贴的自认为是叶证书,却被报告为 CA, 那么您粘贴的是中间证书——本地验证通过而在别处失败的证书链,通常就是这个原因。

扩展列表会显示存在的每一个扩展及其 critical 标志。依据 RFC 5280,客户端无法理解的 critical 扩展必须导致拒绝,因此陌生的 critical 扩展值得调查。

示例

  • 无法通过验证的名称 — 检查 SAN 列表而不是主体。若主机名只在 CN 里,就只能重新 签发证书。
  • 发送 CSR 之前先读一遍 — CSR 固定了主体与公钥。提交前确认名称可以省下一次重签 周期,在 CA 对重签收费时尤其重要。
  • 确认手上是哪一张证书 — 叶证书、中间证书与根证书作为文本看起来都差不多。 basicConstraints 与主体、颁发者的关系可以立刻分辨:根证书的主体与颁发者完全相同。
  • 规划更新 — 剩余天数直接显示。随着业界把最长有效期大幅缩短,原先适用于一年期 证书的人工更新流程无法在这个变化中存活。
  • 审查证书包 — 逐块粘贴。顺序错误的证书包,或夹带了无关证书的证书包,是只在部分 客户端出现的链错误的常见原因。

说明

只接受 CERTIFICATECERTIFICATE REQUEST 两种 PEM 区块。其他任何区块类型 (包括所有私钥格式)都会以指出所发现内容的错误予以拒绝。被拒绝区块中的内容不作解析、 不作显示。

DER 解析器会拒绝 DER 所禁止的形式:不定长度编码、超出缓冲区末尾的长度,以及超过 32 层的嵌套。被截断的粘贴内容会得到 ASN.1 length exceeds buffer 这类具体消息,而不是 一份部分填充的报告,因为半解析的证书会招致误读。解析失败时会清除先前的结果,原因相同。

日期按证书中编码的原样显示。GeneralizedTime 带四位年份;UTCTime 只带两位, RFC 5280 将其解释固定为 50–99 表示 19xx、00–49 表示 20xx。剩余天数按您设备的时钟 计算,因此系统时间错误会得到错误的数字。

本工具只单独读取一张证书,不评估链的构建、吊销与信任。要查看服务器实际发送了什么以及 如何响应,请使用 HTTP 响应头查看安全响应头检测。这里的一切都在您的浏览器内完成—— 见隐私政策

FAQ
证书会被上传到某处吗?
不会。PEM 在浏览器内完成 Base64 解码,DER 结构也在浏览器内解析。不发送任何内容,页面加载之后即可离线使用。这一点比听起来更重要——存放证书的那个剪贴板,通常在片刻之前刚放过它的私钥。
如果我误粘贴了私钥会怎样?
会以指出区块类型的错误予以拒绝,其中的内容不作任何解析与显示。本工具只接受 CERTIFICATE 与 CERTIFICATE REQUEST 区块。处理证书的人手边就有对应的私钥,因此拒绝是唯一安全的默认行为。
为什么证书在主体和 SAN 列表里都列出了同一个域名?
因为只有 SAN 列表有效。浏览器多年前就不再使用主体 CN 做主机名匹配(Chrome 自 58 版起),因此名称只出现在 CN 里的证书无论看起来多正确都会验证失败。CN 保留下来只是为了显示与旧工具。
能告诉我证书是否受信任吗?
不能。信任取决于到某个客户端所信任的根证书的完整链、吊销状态,以及客户端当前的时间。这里读到的是一张证书对自身的声明。自签名证书与公共 CA 签发的证书在这里看起来同样有效,差别体现在颁发者字段上。
为什么我的 CSR 没有有效期?
CSR 本身没有有效期。它是一份包含主体、公钥与所请求扩展的请求,由对应的私钥签名。有效期由签发的 CA 决定,因此 notBefore 与 notAfter 只有在证书签发之后才存在。
剩余天数为负数是什么意思?
表示证书已经过期,数字是过期了多久。日期按证书中编码的原样读取——UTCTime 的年份按 RFC 5280 解释,50 至 99 为 19xx,00 至 49 为 20xx——并与您设备的时钟比较。