KJUR.asn1.x509.Certificate — класс библиотеки jsrsasign, предназначенный для формирования структуры X.509 сертификата и его последующего кодирования в ASN.1/DER формат. В рамках экосистемы Jsrsasign он используется совместно с криптографическими модулями (RSA/ECDSA), обеспечивая полный цикл создания самоподписанных и подписанных удостоверяющими центрами сертификатов.
Объект сертификата в X.509 представляет собой строго определённую ASN.1 структуру, включающую:
В KJUR.asn1.x509.Certificate все эти элементы
формируются через методы класса, а затем сериализуются в DER и PEM
форматы.
Основная идея заключается в том, что разработчик не работает напрямую с ASN.1 деревом, а оперирует высокоуровневыми объектами, которые затем преобразуются в бинарное представление.
Базовая инициализация:
const cert = new KJUR.asn1.x509.Certificate();
После создания объект не содержит значимых данных и требует последовательного заполнения полей.
X.509 поддерживает версии v1, v2 и v3, однако на практике почти всегда используется v3:
cert.setVersionByParam({ version: 3 });
Версия влияет на возможность использования расширений (extensions), которые критичны для современных TLS-сертификатов.
Серийный номер должен быть уникальным в рамках удостоверяющего центра:
cert.setSerialNumberByParam({ int: "01a3f4b2c9" });
Допустимы как hex-строки, так и десятичные значения.
Время действия задаётся через поля notBefore и
notAfter:
cert.setNotBeforeByParam({ str: "230101000000Z" });
cert.setNotAfterByParam({ str: "250101000000Z" });
Формат времени соответствует ASN.1 UTCTime или GeneralizedTime в зависимости от диапазона дат.
Subject описывает владельца сертификата:
cert.setSubjectByParam({
str: "/C=RU/O=Example Corp/CN=example.com"
});
DN (Distinguished Name) поддерживает стандартные атрибуты:
Структура DN строго соответствует X.500.
Issuer определяет удостоверяющий центр, выпустивший сертификат:
cert.setIssuerByParam({
str: "/C=RU/O=Example CA/CN=Example Root CA"
});
В случае самоподписанного сертификата issuer и subject совпадают.
Ключ является центральным элементом сертификата. Он передаётся в объекте ключа Jsrsasign:
const rsaKey = KEYUTIL.generateKeypair("RSA", 2048).pubKeyObj;
cert.setPublicKey(rsaKey);
Поддерживаются RSA и ECDSA ключи, при условии совместимости с
KJUR.crypto модулями.
Алгоритм определяется явно при создании подписи:
cert.signByParam({
dsa: "SHA256withRSA",
priKey: privateKey
});
Чаще всего используются:
Алгоритм должен соответствовать типу ключа.
Типичный сценарий включает генерацию ключевой пары и создание сертификата:
const kp = KEYUTIL.generateKeypair("RSA", 2048);
const cert = new KJUR.asn1.x509.Certificate();
cert.setSerialNumberByParam({ int: "01" });
cert.setIssuerByParam({ str: "/C=RU/O=Test/CN=Test CA" });
cert.setSubjectByParam({ str: "/C=RU/O=Test/CN=example.com" });
cert.setNotBeforeByParam({ str: "240101000000Z" });
cert.setNotAfterByParam({ str: "260101000000Z" });
cert.setPublicKey(kp.pubKeyObj);
cert.signByParam({
dsa: "SHA256withRSA",
priKey: kp.prvKeyObj
});
После этого объект содержит готовую подпись и может быть сериализован.
Финальный сертификат обычно экспортируется в PEM:
const pem = cert.getPEM();
PEM представляет собой Base64-кодированный DER с заголовками:
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
Внутри KJUR.asn1.x509.Certificate формируется ASN.1
дерево следующего вида:
TBSCertificate
signatureAlgorithm
signatureValue
Метод getEncodedHex() позволяет получить DER в
hex-формате:
const hex = cert.getEncodedHex();
Для версии v3 поддерживаются расширения:
Пример добавления:
cert.setExtBasicConstraints({
cA: false
});
cert.setExtKeyUsage({
critical: true,
name: ["digitalSignature", "keyEncipherment"]
});
Расширения критичны для TLS и определения роли сертификата.
Jsrsasign использует строковое представление времени ASN.1, поэтому важно соблюдать формат:
Ошибки формата приводят к некорректной валидации сертификата на стороне OpenSSL и браузеров.
Класс не выполняет криптографическую проверку доверия цепочки сертификатов. Он отвечает только за:
Проверка цепочек осуществляется отдельными модулями Jsrsasign
(KJUR.x509.Certificate parser и verifier).
Сгенерированные сертификаты совместимы с:
При условии корректного выбора алгоритмов и длины ключа.
Неправильная настройка issuer и subject
приводит к:
Несоответствие алгоритма подписи и типа ключа вызывает:
bad signature algorithmОтсутствие расширений в v3 сертификатах часто делает сертификат непригодным для HTTPS.
KJUR.asn1.x509.Certificate тесно связан с:
KEYUTIL — генерация и импорт ключейKJUR.crypto.Signature — криптографическая подписьX509 — парсинг и проверка сертификатовТипичный рабочий процесс включает генерацию ключа, формирование сертификата и последующую проверку через X.509 парсер.