如何用OpenSSL在终端验证Auth0 JWT签名?实操失败排查
解决OpenSSL手动验证JWT签名失败的问题
我之前也踩过类似的坑!你在jwt.io上能正常验证,但用OpenSSL手动操作就返回失败,问题出在两个容易被忽略的细节上:
你的操作里的关键错误
Base64URL转标准Base64时缺失填充字符
JWT使用的Base64URL格式会去掉末尾的=填充符,但标准Base64解码必须依赖这些填充才能正确解析。你当前的转换命令只替换了-和_,没有补充必要的=,导致签名解码可能不完整。echo自动添加了多余换行符
当你用echo $DAT_B64输出header+payload部分时,默认会在末尾追加一个\n换行符,但JWT的签名是基于完全无换行的原始字符串计算的。这就导致你验证的内容和签名生成时的内容不一致,自然验证失败。
修正后的完整操作步骤
把这两个问题修复后,完整的命令如下:
# 读取JWT并转换为标准Base64(自动补充必要的=填充) TOKEN_B64=$(cat token.b64url | tr '-' '+' | tr '_' '/' | awk '{while(length%4) $0=$0"="; print}') # 分离签名部分并解码到文件 SIG_B64=$(echo $TOKEN_B64 | cut -d. -f3) echo -n $SIG_B64 | base64 -d > sig.dat # 分离header和payload的组合部分 DAT_B64=$(echo $TOKEN_B64 | cut -d. -f1-2) # 验证签名(用echo -n避免添加换行符) echo -n $DAT_B64 | openssl dgst -sha256 -verify public_key.pem -signature sig.dat
执行这些命令后,应该就能得到你预期的Verification OK结果了。
内容的提问来源于stack exchange,提问作者KimKong
相关产品推荐
相关产品推荐

