为什么 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 更改后的证书。否则我们无法判断是在验证过程中出现错误还是只是表面上的更改。
今天,我用 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 更改后的证书。否则我们无法判断是在验证过程中出现错误还是只是表面上的更改。