为什么 jwt.io 在删除证书的某些字符后显示签名有效?

Why does jwt.io show signature as valid after deleting some characters of the certificate?

今天,我用 jwt.io 验证了 JWT 访问令牌。

访问令牌使用 RS256 算法并经过数字签名。

为了验证签名,我把包含-----BEGIN CERTIFICATE----- 和-----END CERTIFICATE----- 的证书放在BOX1:

RSASHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  BOX1,
  BOX2
)

执行此操作后,状态会按预期从红色“无效签名”变为蓝色“已验证签名”。

然后我不小心删除了证书的一个字符,导致状态为蓝色“已验证签名”。

这让我很好奇,所以我做了一些简单的实验:

这适用于证书的最后 7 行(证书为 18 行 x 64 个字符)。在前 11 行中,删除一个字符会导致永久“无效签名”。

这种行为 jwt.io 是特定的吗? 或者,是否期望从证书中删除特定字符会导致签名仍然有效?

不,这不是 jwt.io 具体的。首先,证书中的数据本身使用 ASN.1 进行结构化,然后使用 DER 编码为二进制。如果将 base 64 粘贴到 ASN.1 解码器(例如找到 here 的解码器或通过例如使用 openssl asn1parse.

证书中的大部分数据都是 tbsCertificate 结构的一部分,其中 TBS 代表“待签名”。对证书该部分的任何更改都应导致失败,因为这是已签名的证书部分。这当然假设证书的签名 确实得到了验证 。通常情况是这样 除非 明确信任证书。

如果您更改签名本身,那么签名验证当然也可能会失败。但请注意,签名本身也是经过编码的,签名 meta-data 中的更改可能 而不是 引入失败。此签名出现在证书的末尾。

您可能需要 post 更改后的证书。否则我们无法判断是在验证过程中出现错误还是只是表面上的更改。