Формат PKCS
PKCS#8 определяет контейнер, который инкапсулирует сам приватный ключ и метаданные о нем. Внутренне структура делится на несколько ключевых компонентов:
В отличие от формата PKCS#1, который предназначен исключительно для RSA, PKCS#8 является алгоритм-независимым, что делает его стандартом де-факто для хранения приватных ключей в PEM/DER представлении.
PKCS#8 может быть представлен в двух основных формах:
Бинарный формат, используемый внутри протоколов и систем. Представляет собой ASN.1 структуру, закодированную в байтовую последовательность.
Текстовое представление DER с Base64-кодированием и заголовками:
-----BEGIN PRIVATE KEY-----
...base64...
-----END PRIVATE KEY-----
Для зашифрованных ключей используется другой заголовок:
-----BEGIN ENCRYPTED PRIVATE KEY-----
Не зашифрованный приватный ключ PKCS#8 содержит ключевые данные в открытом виде внутри структуры. В JavaScript с использованием jsrsasign это часто встречается при генерации или экспорте ключей.
Пример обработки через jsrsasign:
const keyObj = KEYUTIL.getKey(pemPrivateKey);
Функция автоматически определяет формат PKCS#8 и преобразует его в внутреннее представление объекта ключа.
Экспорт обратно:
const pem = KEYUTIL.getPEM(keyObj, "PKCS8PRV");
Здесь параметр "PKCS8PRV" указывает, что выходной формат
должен соответствовать PKCS#8.
Зашифрованный вариант PKCS#8 используется для безопасного хранения приватных ключей. Шифрование выполняется с использованием симметричных алгоритмов (например, AES) и пароля пользователя.
Структура включает дополнительные поля:
В jsrsasign работа с зашифрованными ключами выглядит следующим образом:
const keyObj = KEYUTIL.getKey(encryptedPem, password);
Если пароль корректный, библиотека расшифровывает содержимое и возвращает объект ключа.
Генерация зашифрованного PEM:
const encryptedPem = KEYUTIL.getPEM(keyObj, "PKCS8PRV", password);
При указании пароля jsrsasign автоматически применяет стандарт PBES2 с подходящими параметрами шифрования.
На уровне ASN.1 описание выглядит следующим образом:
PrivateKeyInfo ::= SEQUENCE {
version Version,
privateKeyAlgorithm AlgorithmIdentifier,
privateKey OCTET STRING,
attributes [0] IMPLICIT Attributes OPTIONAL
}
Для зашифрованного варианта:
EncryptedPrivateKeyInfo ::= SEQUENCE {
encryptionAlgorithm AlgorithmIdentifier,
encryptedData OCTET STRING
}
Jsrsasign скрывает эти детали, но понимание структуры важно при отладке и совместимости с другими системами (OpenSSL, Java KeyStore, PKCS#12).
RSA ключи часто преобразуются между PKCS#1 и PKCS#8. В jsrsasign это происходит автоматически.
Пример RSA ключа в PKCS#8:
const rsaKey = KEYUTIL.getKey(pem);
Если PEM содержит PKCS#1, библиотека оборачивает его в PKCS#8 при экспорте:
const pkcs8Pem = KEYUTIL.getPEM(rsaKey, "PKCS8PRV");
Это важно при интеграции с API, требующими строгого соответствия PKCS#8 (например, WebCrypto API или Java серверы).
Jsrsasign предоставляет универсальные механизмы конвертации:
const key = KEYUTIL.getKey(pemString);
const pem = KEYUTIL.getPEM(key, "PKCS8PRV");
const encPem = KEYUTIL.getPEM(key, "PKCS8PRV", "password");
PKCS#8 используется как основной формат в следующих системах:
Jsrsasign обеспечивает совместимость с этими системами за счет строгого соблюдения ASN.1 и поддержки стандартных алгоритмов шифрования.
Причины:
При расшифровке:
KEYUTIL.getKey(encryptedPem, password);
неверный пароль приводит к ошибке дешифрования, так как PBES2 использует производные ключи из пароля.
Старые системы могут не поддерживать современные схемы шифрования PKCS#8 (например, PBKDF2 + AES-256). В таких случаях требуется конвертация через OpenSSL или настройка параметров генерации.
Jsrsasign позволяет создавать новые ключи и сразу экспортировать их в PKCS#8:
const rsa = KEYUTIL.generateKeypair("RSA", 2048);
const privatePem = KEYUTIL.getPEM(rsa.prvKeyObj, "PKCS8PRV");
Для эллиптических кривых:
const ec = KEYUTIL.generateKeypair("EC", "secp256r1");
const ecPem = KEYUTIL.getPEM(ec.prvKeyObj, "PKCS8PRV");
PKCS#8 особенно важен в следующих задачах:
Jsrsasign выступает как слой абстракции, скрывающий ASN.1-сложность и предоставляющий единый API для всех этих операций.
Библиотека автоматически:
Основной объект-утилита:
KEYUTIL
Он является центральной точкой работы с приватными ключами и PKCS#8 структурой в целом.