Библиотека JOSE предоставляет набор функций для работы с современными криптографическими форматами, используемыми в экосистеме JWT, JWS, JWE и JWK. Одной из ключевых задач при работе с асимметричной криптографией является корректный импорт ключей из различных представлений: PEM, X.509 и JWK.
В библиотеке за это отвечают функции importSPKI,
importPKCS8, importX509,
importJWK. Каждая из них предназначена для строго
определённого формата входных данных и типа ключа.
Внутри JOSE ключи приводятся к единому внутреннему представлению —
CryptoKey (Web Crypto API). Это позволяет унифицировать
операции подписи, проверки, шифрования и расшифрования независимо от
исходного формата ключа.
Типовая цепочка выглядит так:
CryptoKeySignJWT, jwtVerify,
CompactEncrypt и других APIimportSPKI используется для импорта публичных
ключей, представленных в формате SPKI (Subject Public
Key Info), обычно закодированных в PEM.
SPKI — это стандарт X.509 для хранения публичных ключей без приватной части.
importSPKI(pem, alg, options?)
pem — строка PEM с публичным ключомalg — алгоритм (например, "RS256",
"ES256")options — дополнительные параметры (редко
используются)-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqh...
-----END PUBLIC KEY-----
import { importSPKI, jwtVerify } from 'jose'
const publicKey = await importSPKI(
process.env.PUBLIC_KEY,
'RS256'
)
const { payload } = await jwtVerify(token, publicKey)
importPKCS8 применяется для загрузки приватных
ключей, закодированных в формате PKCS#8.
PKCS#8 — универсальный стандарт хранения приватных ключей, поддерживающий RSA, EC и другие алгоритмы.
importPKCS8(pem, alg, options?)
pem — PEM строка приватного ключаalg — алгоритм (например, "RS256",
"ES256")options — дополнительные параметры-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqh...
-----END PRIVATE KEY-----
import { importPKCS8, SignJWT } from 'jose'
const privateKey = await importPKCS8(
process.env.PRIVATE_KEY,
'RS256'
)
const jwt = await new SignJWT({ sub: '123' })
.setProtectedHeader({ alg: 'RS256' })
.sign(privateKey)
importX509 предназначен для извлечения публичного ключа
из X.509 сертификата.
В отличие от importSPKI, здесь входом является не просто
ключ, а сертификат, содержащий метаданные и подпись удостоверяющего
центра.
importX509(cert, alg, options?)
cert — PEM сертификат X.509alg — алгоритм ключаoptions — дополнительные параметры-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIEb...
-----END CERTIFICATE-----
import { importX509, jwtVerify } from 'jose'
const publicKey = await importX509(
process.env.CERT,
'RS256'
)
const { payload } = await jwtVerify(token, publicKey)
| Параметр | importSPKI | importX509 |
|---|---|---|
| Вход | публичный ключ | сертификат |
| Метаданные | нет | есть |
| CA цепочка | нет | может присутствовать |
| Использование | JWT verification | enterprise PKI |
importJWK используется для загрузки ключей в формате
JWK (JSON Web Key) — стандартизированного
JSON-представления криптографических ключей.
importJWK(jwk, alg, options?)
jwk — объект JSON Web Keyalg — алгоритм (например, "RS256")options — дополнительные параметры{
"kty": "RSA",
"e": "AQAB",
"n": "sXch...base64...",
"alg": "RS256",
"use": "sig"
}
import { importJWK, jwtVerify } from 'jose'
const jwk = {
kty: 'RSA',
e: 'AQAB',
n: process.env.JWK_N
}
const publicKey = await importJWK(jwk, 'RS256')
const { payload } = await jwtVerify(token, publicKey)
kid, use,
alg)| Метод | Формат входа | Тип ключа | Основное применение |
|---|---|---|---|
| importSPKI | PEM (SPKI) | публичный | проверка JWT |
| importPKCS8 | PEM (PKCS#8) | приватный | подпись JWT |
| importX509 | PEM сертификат | публичный | PKI / TLS / enterprise |
| importJWK | JSON | публичный / приватный | API / JWKS |
Во всех функциях важно корректно указывать алгоритм:
"RS256", "PS256""ES256", "ES384""EdDSA"Алгоритм определяет:
Если ключ RSA, а указан ES256:
JOSENotSupported: unsupported key algorithm
JWKInvalid: failed to parse key
importSPKIimportPKCS8После импорта все ключи приводятся к CryptoKey:
sign,
verify)Это позволяет использовать единый API:
jwtVerifySignJWTjwtDecryptCompactEncryptimportSPKIimportPKCS8importX509importJWK