菜单

签名证明能证明什么,不能证明什么

2026-10-09MCP Checkup

本文译自 2026-09-14 的英文原文。

报告页上,每次有签名的 run 下面都有一个指向签名证明的链接。它看起来很正式,正因如此,才更需要把它说准确。签名是一件用途很窄的工具:老老实实地用,它能把一件事证明得很好,除此之外什么也不证明。

它长什么样

签名证明是一个 DSSE envelope,即公开的 Dead Simple Signing Envelope 规范,一共三个字段:一个 payloadType,一个 base64 编码的 payload,以及一组 signatures。我们用 Ed25519 签名;payload 是一份 JSON 文档,里面写明:

  • 被检查的 endpoint,以及这次 run 的时间;
  • 这次 run 产出的每一条断言,连同它的状态和结构化的原因;
  • 这次 run 算出的指纹(工具集、schema);
  • 跑的是哪份代码:从 payload 0.3 版起,有一个 suite_commit,即我们仓库里的一个 commit;还有一个 suite_digest,是对该 commit 下检查套件的 git 树清单取的 SHA-512。更早的 payload 只带 suite_digest,用的是一个已经无法复算的旧定义,它们的签名证明页会写明这一点。

签名证明页上完整展示这个 envelope,你可以把它另存为文件。签名覆盖的是 payload 的字节,所以任何一个字段哪怕只改动一点点,签名都会失效。

它证明什么

恰好是这一件事:在这个日期,我们的探测器运行着这份特定的代码,对这个 endpoint 观测到了这些情况,而且此后没有人改动过这份记录。

每个分句都有分量。

我们的探测器。 签名把这份记录和我们的签名密钥绑在一起。报告页可以伪造;但只要密钥没有泄露,就没人能对伪造的 payload 做出有效签名。密钥只存在于签名服务内部,从不出现在网站、数据库或代码仓库里。

这份特定的代码。 suite_digest 是大家最容易跳过的部分,也是分量最重的部分。一项检查的含义取决于它是怎样实现的。同样一句「握手失败」,在一个只把 400 当作旧版回退信号的探测器下,和在一个接受任意 4xx 的探测器下,意思并不一样(这两种我们都上线过,前一种是 bug)。对 0.3 版的 payload,任何人只要拿到该 commit 的仓库,就能复算这个摘要,确认是哪一种行为产出了这份记录。

此后没有人改动过。 这是签名最寻常的属性,也正是它让这份记录对一个不信任我们网站的第三方有用。

它不证明什么

它不证明这台 server 是好的。它不证明一小时后这台 server 的表现还一样。它也不证明工具被调用时会做什么,因为我们从不调用它们。它不证明这些检查选得对。它是一份经过公证的观测,而一份观测有多大用处,取决于读者是否明白观测的到底是什么。

这也是未签名的观测不着颜色的原因:没有签名在背后的颜色,会给这些观测一份它们并没有挣到的分量。

今天就能自己核验一份

envelope 遵循一份公开规范,验证脚本就在我们的公开仓库 github.com/mcpcheckup/checks 里。用来验证我们签名的公钥发布在 /.well-known/mcpcheckup-keys.json,也在 /keys 列出来供人查看。先下载公钥文件,再对你从签名证明页保存下来的 envelope 运行验证脚本:

curl -fsS https://mcpcheckup.com/.well-known/mcpcheckup-keys.json -o keys.json
node packages/verifier/verify-attestation.mjs --envelope <id>.json --keys keys.json

验证脚本会在这个文件里查找 envelope 的 keyid,找不到就判为失败。如果这把公钥已被吊销,或者 payload 的 observed_at 落在该公钥从 valid_from 到 valid_until 的区间之外,它同样判为失败。它只读你交给它的文件,不发出任何网络请求。

对 0.3 版的 payload,如果你手里有该 commit 的仓库,还可以复算 suite_digest;签名证明页上印着这条命令。签名不会过期,但公钥可以被吊销:你今天保存的 envelope,以后可以拿更新的公钥文件再核验一次;如果那个文件把这把公钥列为已吊销,这份 envelope 就验证失败。退役的公钥会留在发布的列表里,observed_at 不晚于其截止日期的 envelope 依然有效。

为什么公钥发布之前我们就开始签名

因为这份纪律必须先于读者存在。从第一天起就签名,意味着记录里任何一条签名观测都不可能在事后被改过。现在公钥已经发布,核验覆盖的是所有公钥在发布列表里的签名观测,而不只是发布之后做出的那些。