Перейти к содержимому
ecdsa.com
jsonwebtoken (Node.js)Библиотеки JWT

Сообщение об ошибке

secretOrPublicKey must be an asymmetric key when using ES256

Что это означает

Вы попросили jsonwebtoken проверить (или подписать: в парном сообщении вместо этого стоит secretOrPrivateKey) токен ES256, но передали симметричный секрет — обычную строку или Buffer, а не PEM и не KeyObject. ES256 — это ECDSA на кривой P-256: для него нужна пара ключей EC, а не общий секрет.

Почему это происходит

Как исправить

  1. 1.

    Загрузите настоящий открытый ключ EC

    Проверяйте ES256 с помощью PEM (SPKI) или KeyObject. Если у вас 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 через вспомогательную функцию

    Если издатель публикует ключи по URL JWKS, не передавайте этот 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. Именно смешивание этих двух семейств и предотвращает эта ошибка, в том числе классический сценарий атаки с подменой типа ключа.

Связанные ошибки

Открыть всю базу ошибок подписей