Перейти к содержимому
ecdsa.com
Node.js cryptoМодуль crypto в Node.js

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

Invalid JWK EC key

Node.js crypto — TypeError, code ERR_CRYPTO_INVALID_JWK

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

createPublicKey/createPrivateKey с format: "jwk" отклонили объект JWK: не хватает обязательных полей, координаты не декодируются или точка (x, y) на самом деле не лежит на указанной кривой. Node проверяет точку при импорте, поэтому повреждённая или усечённая координата обнаруживается здесь, а не превращается в ключ, с которым ни одна подпись не проходит проверку. Те же проверки выполняются независимо от того, откуда пришёл JWK: с эндпоинта JWKS, из файла конфигурации или из другого сервиса — ошибка указывает на сам объект, а не на способ доставки.

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

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

  1. 1.

    Проверяйте структуру JWK перед импортом

    Проверьте поля и длины после декодирования. Для P-256 каждая из координат x и y должна декодироваться ровно в 32 байта.

    js
    const x = Buffer.from(jwk.x, "base64url");
    const y = Buffer.from(jwk.y, "base64url");
    console.log(jwk.kty, jwk.crv, x.length, y.length); // EC P-256 32 32
  2. 2.

    Дополняйте короткие координаты нулями слева

    Если источник отбросил ведущие нули, восстановите фиксированную длину до того, как собирать JWK.

    js
    const pad32 = (b) => Buffer.concat([Buffer.alloc(32 - b.length), b]);
    jwk.x = pad32(Buffer.from(jwk.x, "base64url")).toString("base64url");
    jwk.y = pad32(Buffer.from(jwk.y, "base64url")).toString("base64url");
    const key = crypto.createPublicKey({ key: jwk, format: "jwk" });
  3. 3.

    Заново получите ключ из доверенного источника

    Если координаты не проходят проверку и вы не собирали JWK сами, не чините байты, а заново загрузите его с эндпоинта JWKS издателя: JWK, который приходится латать вручную, доверия не заслуживает.

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

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