跳到主要内容
ecdsa.com
jsonwebtoken (Node.js)JWT 库

错误信息

secretOrPublicKey must be an asymmetric key when using ES256

含义

你让 jsonwebtoken 验证(或者签名——与之对应的另一条消息写的是 secretOrPrivateKey)一个 ES256 令牌,但你提供的密钥材料是对称密钥——一个既不是 PEM 也不是 KeyObject 的普通字符串或 Buffer。ES256 是基于 P-256 的 ECDSA:它需要 EC 密钥对,而不是共享密钥。

原因

修复方法

  1. 1.

    加载真正的 EC 公钥

    用 PEM(SPKI)或 KeyObject 验证 ES256。如果你手里是 JWK(例如来自 JWKS 端点),先用 node:crypto 转换。

    js
    import { createPublicKey } from "node:crypto";
    
    const key = createPublicKey({ key: jwk, format: "jwk" }); // or a PEM string
    jwt.verify(token, key, { algorithms: ["ES256"] });
  2. 2.

    用辅助函数获取 JWKS 中的密钥

    如果你的颁发者在 JWKS URL 上发布密钥,不要把 URL 当作密钥传入——应针对每个令牌按 kid 获取对应的密钥。

    js
    import { createRemoteJWKSet, jwtVerify } from "jose";
    
    const jwks = createRemoteJWKSet(new URL("https://issuer.example/.well-known/jwks.json"));
    const { payload } = await jwtVerify(token, jwks, { algorithms: ["ES256"] });
  3. 3.

    或者:你其实想用的是 HS256

    如果颁发者和验证方都是你自己的服务,并且有意使用共享密钥,就在两端都设置 algorithm: "HS256",而不是 ES256。这个错误要防止的正是混用这两类算法——包括经典的密钥混淆攻击场景。

相关错误

浏览完整的签名错误库