Загрузка ключей из PEM, DER, JWK

Библиотека jsrsasign предоставляет универсальные инструменты для загрузки, парсинга и использования криптографических ключей в различных форматах. На практике чаще всего встречаются три представления ключей:

  • PEM — текстовый формат с Base64-кодированием и заголовками
  • DER — бинарное ASN.1-представление
  • JWK (JSON Web Key) — JSON-структура, используемая в веб-стандартах

Каждый из форматов имеет свои особенности, и библиотека предоставляет единый API для их обработки.


Загрузка ключей в формате PEM

Структура PEM

PEM-файл содержит Base64-кодированные данные, обрамлённые строками:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A...
-----END PUBLIC KEY-----

или для приватного ключа:

-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----

Импорт ключа

Для загрузки ключа используется функция:

var key = KEYUTIL.getKey(pemString);

Особенности:

  • Автоматически определяется тип ключа (RSA, EC, DSA)
  • Поддерживаются как публичные, так и приватные ключи
  • Возможна загрузка зашифрованных ключей (с паролем)

Пример с паролем

var key = KEYUTIL.getKey(pemString, "password");

Определение типа ключа

После загрузки:

console.log(key.type); // "RSA", "EC" и др.
console.log(key.isPrivate); // true / false

Загрузка ключей в формате DER

Особенности DER

DER — это бинарное представление ASN.1-структуры. В отличие от PEM:

  • не содержит заголовков
  • не кодируется в Base64
  • используется в сертификатах и низкоуровневых системах

Подготовка данных

DER-данные обычно представлены:

  • как ArrayBuffer
  • как hex-строка
  • как Base64 без заголовков

Импорт через hex

var hex = "3082010A0282010100...";
var key = KEYUTIL.getKey({hex: hex, format: "der"});

Импорт через Base64

var b64 = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A...";
var key = KEYUTIL.getKey(b64);

Автоопределение

Если передан Base64 без PEM-заголовков, библиотека:

  • попытается распознать формат
  • автоматически преобразует в ASN.1

Загрузка ключей в формате JWK

Структура JWK

JWK — это JSON-объект. Пример RSA-публичного ключа:

{
  "kty": "RSA",
  "n": "sXch...base64url...",
  "e": "AQAB"
}

Приватный ключ включает дополнительные поля:

{
  "kty": "RSA",
  "n": "...",
  "e": "...",
  "d": "...",
  "p": "...",
  "q": "...",
  "dp": "...",
  "dq": "...",
  "qi": "..."
}

Импорт JWK

var key = KEYUTIL.getKey(jwkObject);

или:

var key = KEYUTIL.getKey(JSON.stringify(jwkObject));

Поддержка алгоритмов

  • RSA (kty: "RSA")
  • EC (kty: "EC")
  • Octet (симметричные ключи, kty: "oct")

Унифицированный API загрузки

Функция KEYUTIL.getKey принимает различные типы входных данных:

Формат Тип входных данных
PEM строка
DER hex / Base64
JWK объект или JSON

Это позволяет использовать единый механизм:

var key = KEYUTIL.getKey(input);

Работа с ASN.1 внутри ключей

jsrsasign использует ASN.1-парсер для:

  • разбора структуры ключа
  • извлечения параметров (модуль, экспонента)
  • проверки корректности

Пример извлечения параметров RSA:

console.log(key.n.toString(16)); // модуль
console.log(key.e.toString(10)); // экспонента

Конвертация между форматами

PEM → JWK

var key = KEYUTIL.getKey(pem);
var jwk = KEYUTIL.getJWKFromKey(key);

JWK → PEM

var key = KEYUTIL.getKey(jwk);
var pem = KEYUTIL.getPEM(key);

DER → PEM

var key = KEYUTIL.getKey({hex: hex});
var pem = KEYUTIL.getPEM(key);

Загрузка публичных и приватных ключей

jsrsasign различает ключи автоматически:

if (key.isPrivate) {
    // приватный ключ
} else {
    // публичный ключ
}

Для публичного ключа доступны:

  • шифрование
  • проверка подписи

Для приватного:

  • расшифровка
  • создание подписи

Работа с сертификатами (X.509)

PEM-файлы могут содержать сертификаты:

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

Извлечение ключа:

var cert = new X509();
cert.readCertPEM(pemCert);

var pubKey = cert.getPublicKey();

Обработка ошибок

Типичные ошибки при загрузке:

  • неверный формат
  • повреждённый Base64
  • несоответствие структуры ASN.1
  • неправильный пароль

Пример обработки:

try {
    var key = KEYUTIL.getKey(data);
} catch (e) {
    console.error("Ошибка загрузки ключа:", e);
}

Безопасность при загрузке ключей

  • избегается хранение приватных ключей в открытом виде
  • используется защита паролем (PKCS#8)
  • проверяется структура ASN.1
  • поддерживается безопасное удаление данных из памяти

Практический пример

Загрузка ключа независимо от формата:

function loadKey(input) {
    try {
        return KEYUTIL.getKey(input);
    } catch (e) {
        throw new Error("Не удалось загрузить ключ");
    }
}

Использование:

var key = loadKey(pemOrDerOrJwk);

Поддержка алгоритмов

После загрузки ключ может использоваться с:

  • KJUR.crypto.Signature
  • KJUR.crypto.Cipher
  • KJUR.jws.JWS

Пример:

var sig = new KJUR.crypto.Signature({"alg": "SHA256withRSA"});
sig.init(key);
sig.updateString("data");
var signature = sig.sign();

Итоговая архитектура загрузки

  1. Входные данные (PEM / DER / JWK)
  2. Автоопределение формата
  3. ASN.1 парсинг (если требуется)
  4. Создание объекта ключа
  5. Использование в криптографических операциях

Глубокая интеграция с форматами ключей делает jsrsasign универсальным инструментом для работы с криптографией в браузере и Node.js, обеспечивая совместимость с большинством стандартов и протоколов.