NodeJS调用AWS KMS实现JWT签名验证抛出KMSInvalidSignatureException如何解决
问题排查与修复方案
核心错误原因
你遇到的KMSInvalidSignatureException异常由两个常见原因导致:
- 验签时签名参数格式错误:你生成JWT时将KMS返回的二进制签名转成了base64url编码的字符串,但是调用
kms.verify接口时直接传入了这个编码后的字符串,AWS KMS的verify接口要求Signature参数必须传入原始二进制Buffer,不能是编码后的字符串。 - 密钥配置错误:请确认你在AWS KMS中创建的RSA 2048密钥的密钥用途设置为
签名和验证(SIGN_VERIFY),如果密钥用途配置为加密/解密,也会触发验签失败异常。
修复后的代码
只需修改verifyToken函数,将base64url格式的签名解码为原始Buffer即可:
async function verifyToken(token) { const [header, payload, signature] = token.split('.'); const message = Buffer.from(`${header}.${payload}`); // 新增:将base64url格式的签名解码为原始二进制Buffer const decodedSignature = base64url.toBuffer(signature); return await kms.verify({ KeyId: process.env.KEY_ID, Message: message, MessageType: 'RAW', Signature: decodedSignature, // 替换为解码后的Buffer SigningAlgorithm: 'RSASSA_PKCS1_V1_5_SHA_256' }).promise(); }
额外校验项
如果修改后仍然报错,可以逐一检查以下配置:
- 确认你使用的AWS账号/角色拥有该KMS密钥的
kms:Sign和kms:Verify权限 - 确认签名和验签使用的是同一个KMS密钥
- 确认签名算法
RSASSA_PKCS1_V1_5_SHA_256和JWT头中声明的RS256对应一致
内容的提问来源于stack exchange,提问作者user4209634
相关产品推荐
相关产品推荐

