Ошибка возникает в библиотеке JOSE при попытке использования криптографического алгоритма, который явно запрещён политикой приложения или не входит в список разрешённых алгоритмов при верификации или шифровании токенов. В экосистеме JOSE (JSON Object Signing and Encryption) контроль алгоритмов является одним из ключевых механизмов безопасности, так как именно через выбор слабого или устаревшего алгоритма чаще всего происходят криптографические атаки.
В библиотеке jose (современная реализация для Node.js и
браузера) эта ошибка появляется в момент, когда вызываемый алгоритм не
соответствует ограничениям, заданным разработчиком через конфигурацию
или контекст проверки токена.
Основные сценарии:
HS256 запрещён, но токен подписан им)EdDSA или RS256)algorithms
при верификацииВ современных реализациях jose разработчик часто задаёт
список допустимых алгоритмов вручную:
import { jwtVerify } from 'jose'
await jwtVerify(token, key, {
algorithms: ['RS256', 'ES256']
})
Если токен будет подписан, например, HS256, будет
выброшена ошибка, эквивалентная JOSEAlgNotAllowed.
С точки зрения архитектуры JOSE, алгоритм — это часть защищённого заголовка JWT:
{
"alg": "HS256",
"typ": "JWT"
}
При верификации библиотека выполняет строгую проверку:
alg из заголовка токенаJOSEAlgNotAllowedЭто предотвращает атаки класса “alg confusion”, когда злоумышленник подменяет алгоритм подписи на более слабый или вообще на симметричный.
import { jwtVerify } from 'jose'
const key = new TextEncoder().encode('secret')
await jwtVerify(token, key, {
algorithms: ['RS256']
})
Если token подписан как:
{ "alg": "HS256" }
результатом будет ошибка JOSEAlgNotAllowed.
alg до выполнения криптографических
операцийОшибка JOSENotSupported возникает, когда библиотека JOSE
сталкивается с операцией, которая не поддерживается текущей средой
выполнения, криптографическим провайдером или версией реализации.
В отличие от JOSEAlgNotAllowed, которая связана с
политикой безопасности, JOSENotSupported указывает на
техническую невозможность выполнения операции.
joseimport { SignJWT } from 'jose'
await new SignJWT({ sub: '123' })
.setProtectedHeader({ alg: 'EdDSA' })
.sign(privateKey)
Если среда не поддерживает EdDSA, будет выброшена ошибка
JOSENotSupported.
Современная версия jose активно использует
WebCrypto:
window.crypto.subtlecrypto.webcrypto.subtleЕсли нужная операция отсутствует в реализации, возникает ошибка поддержки.
Пример ограничений:
Ed25519RSA-PSSЧастый источник ошибки:
Пример:
await jwtVerify(token, rsaPublicKey, {
algorithms: ['ES256']
})
Здесь ожидается EC-ключ, но передан RSA, что приводит к
JOSENotSupported.
JOSE строго разделяет типы ключей:
Неверная комбинация приводит к невозможности выполнения криптографической операции.
При появлении JOSENotSupported важно проверить:
>= 16/18/20 для современных
алгоритмов)importKey или
importPKCS8import { generateKeyPair } from 'jose'
const { publicKey, privateKey } = await generateKeyPair('RS256')
Если генерация или использование ключа падает, значит окружение не поддерживает алгоритм.
JOSEAlgNotAllowed — алгоритм запрещён политикой
приложенияJOSENotSupported — алгоритм или операция технически
невозможны в текущей средеПервый связан с безопасностью, второй — с ограничениями реализации.
В системах с высокой нагрузкой и распределённой архитектурой ошибки поддержки часто выявляются только в runtime, поэтому предварительная проверка окружения становится обязательной частью интеграции JOSE.