Взаимодействие между jsrsasign и OpenSSL опирается на единые представления криптографических объектов, где ключевую роль играют форматы PEM и DER.
PEM представляет собой Base64-кодирование бинарных данных DER с добавлением заголовков и разделителей:
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
DER — бинарный ASN.1-формат, используемый как внутренняя форма представления ключей, сертификатов и подписей.
OpenSSL работает с обоими форматами напрямую, тогда как jsrsasign использует их через преобразование в строки и объекты JavaScript. Основная точка совместимости заключается в корректном распознавании структуры ASN.1.
В экосистеме RSA часто встречаются два стандарта представления приватных ключей:
OpenSSL по умолчанию часто генерирует PKCS#8:
openssl genpkey -algorithm RSA -out private_key.pem
jsrsasign поддерживает оба варианта через KEYUTIL:
const rsakey = KEYUTIL.getKey(pemKey);
При этом PKCS#1 ключи имеют структуру:
-----BEGIN RSA PRIVATE KEY-----
PKCS#8:
-----BEGIN PRIVATE KEY-----
Несовпадение форматов является одной из частых причин ошибок импорта.
OpenSSL используется как источник или валидатор криптографических материалов, jsrsasign — как среда выполнения в браузере или Node.js.
Экспорт RSA приватного ключа в OpenSSL:
openssl rsa -in private_key.pem -out pkcs1.pem
Преобразование PKCS#8 в PKCS#1:
openssl pkcs8 -topk8 -nocrypt -in key.pem -out pkcs8.pem
jsrsasign интерпретирует ключ через универсальный парсер:
const key = KEYUTIL.getKey(pem);
const sig = new KJUR.crypto.Signature({ alg: "SHA256withRSA" });
sig.init(key);
Совместимость подписей между OpenSSL и jsrsasign достигается через согласование алгоритма хеширования и схемы подписи.
OpenSSL:
openssl dgst -sha256 -sign private_key.pem -out sig.bin data.txt
Проверка:
openssl dgst -sha256 -verify public_key.pem -signature sig.bin data.txt
jsrsasign:
const sig = new KJUR.crypto.Signature({ alg: "SHA256withRSA" });
sig.init(publicKey);
sig.updateString(data);
const isValid = sig.verify(signatureHex);
Ключевым фактором является совпадение:
OpenSSL поддерживает RSA-PSS как более современную схему:
openssl dgst -sha256 -sign private.pem -sigopt rsa_padding_mode:pss data.txt
jsrsasign требует явного указания параметров:
const sig = new KJUR.crypto.Signature({
alg: "SHA256withRSAandMGF1",
prov: "cryptojs/jsrsa"
});
Несоответствие параметров MGF1 или salt length приводит к несовместимости результатов даже при одинаковых ключах.
OpenSSL и jsrsasign поддерживают набор стандартных эллиптических кривых, таких как secp256r1 (P-256).
Генерация ключа OpenSSL:
openssl ecparam -name prime256v1 -genkey -noout -out ec.pem
Подпись:
openssl dgst -sha256 -sign ec.pem data.txt > sig.bin
jsrsasign:
const sig = new KJUR.crypto.Signature({ alg: "SHA256withECDSA" });
sig.init(ecPublicKey);
sig.updateString(data);
sig.verify(sigHex);
Ключевой аспект совместимости — формат подписи. OpenSSL использует DER-кодирование ECDSA-сигнатуры, содержащей два числа (r, s), тогда как jsrsasign может оперировать HEX-представлением.
OpenSSL часто используется для генерации сертификатов:
openssl req -new -x509 -key private.pem -out cert.pem
jsrsasign предоставляет парсинг и проверку структуры:
const x509 = new X509();
x509.readCertPEM(certPEM);
Внутренняя структура сертификата включает:
OpenSSL валидирует цепочки через локальное хранилище CA, jsrsasign требует явного указания доверенных сертификатов.
CSR создаётся OpenSSL:
openssl req -new -key private.pem -out request.csr
jsrsasign:
const csr = new KJUR.asn1.csr.CertificationRequest({ ... });
Основное совпадение обеспечивается ASN.1 структурой:
OpenSSL проверяет CSR:
openssl req -in request.csr -noout -text
jsrsasign извлекает поля через ASN.1 парсинг без внешних зависимостей.
Частой причиной несовместимости является различие в обработке Base64:
OpenSSL:
jsrsasign:
Ошибки возникают при:
Обе системы опираются на ASN.1 DER-структуры.
jsrsasign реализует собственный ASN.1 парсер:
ASN1HEX.parse(pemHex);
OpenSSL использует C-библиотеку OpenSSL ASN.1 engine.
Совместимость достигается только при строгом соблюдении структуры:
На практике возникают повторяющиеся категории ошибок:
OpenSSL часто применяется как эталон корректности криптографических операций, тогда как jsrsasign используется для выполнения аналогичных операций в среде JavaScript.
Проверка подписи, созданной jsrsasign, через OpenSSL:
openssl dgst -sha256 -verify public.pem -signature sig.bin data.txt
И обратная проверка позволяет выявлять расхождения в алгоритмах и кодировках без необходимости дополнительной отладки на уровне JavaScript.
Поддерживаемые пары:
OpenSSL:
openssl dgst -sha512 data.txt
jsrsasign:
alg: "SHA512withRSA"
Несоответствие алгоритма хеширования приводит к полной невалидности подписи независимо от корректности ключей.
OpenSSL часто используется для генерации инфраструктуры ключей, тогда как jsrsasign выполняет их потребление в приложениях.
Поддерживаемые форматы:
PKCS#12:
openssl pkcs12 -export -out key.p12 -inkey private.pem -in cert.pem
jsrsasign не работает с PKCS#12 напрямую, требуя предварительного извлечения ключей через OpenSSL.
OpenSSL реализует низкоуровневую C-архитектуру криптопровайдера.
jsrsasign использует JavaScript-реализацию (pure JS или WebCrypto fallback).
Различия проявляются в:
Несмотря на архитектурные различия, совместимость достигается на уровне стандартов PKI и криптографических примитивов, а не внутренней реализации.