Пространство имён X509

Библиотека jsrsasign реализует работу с сертификатами стандарта X.509 через пространство имён X509, предоставляя набор классов и утилит для парсинга, анализа и валидации сертификатов. Основной объект — X509, который инкапсулирует данные сертификата и предоставляет методы для извлечения его полей.

Пространство имён организовано так, чтобы разделять:

  • Парсинг ASN.1 структуры
  • Доступ к полям сертификата
  • Работу с расширениями (extensions)
  • Криптографические операции

Класс X509: базовый уровень

Класс X509 является центральным элементом пространства имён. Он используется для загрузки сертификата и извлечения его содержимого.

Создание экземпляра:

var x509 = new X509();
x509.readCertPEM(pemString);

Поддерживаются форматы:

  • PEM (Base64 с заголовками)
  • DER (в виде hex-строки)

Основные методы:

  • readCertPEM(pem) — загрузка сертификата в PEM
  • readCertHex(hex) — загрузка из hex
  • getSubjectString() — строковое представление Subject
  • getIssuerString() — строковое представление Issuer
  • getNotBefore() / getNotAfter() — временные границы действия
  • getSerialNumberHex() — серийный номер

Работа с Distinguished Name (DN)

DN — это структура, описывающая субъект или издателя сертификата. В jsrsasign она представляется в виде строки формата:

/C=US/O=Example Corp/CN=example.com

Методы:

  • getSubjectString()
  • getIssuerString()

Для более детального разбора используется:

x509.getSubject();

Возвращает объект ASN.1, который можно разобрать через утилиты библиотеки.

Ключевые поля DN:

  • C — страна
  • O — организация
  • OU — подразделение
  • CN — общее имя
  • L — город
  • ST — регион

Расширения X509 (Extensions)

Расширения содержат дополнительную информацию о сертификате. jsrsasign предоставляет методы для работы с ними.

Получение списка расширений

x509.getExtInfo();

Часто используемые расширения

Basic Constraints

x509.getExtBasicConstraints();

Возвращает:

{ "cA": true, "pathLen": 0 }

Key Usage

x509.getExtKeyUsage();

Пример:

["digitalSignature", "keyEncipherment"]

Subject Alternative Name (SAN)

x509.getExtSubjectAltName();

Пример:

[
  { "dns": "example.com" },
  { "dns": "www.example.com" }
]

Authority Key Identifier

x509.getExtAuthorityKeyIdentifier();

Работа с публичным ключом

Публичный ключ извлекается напрямую из сертификата:

var pubKey = x509.getPublicKey();

Типы ключей:

  • RSA (RSAKey)
  • ECDSA (KJUR.crypto.ECDSA)
  • DSA

Получение параметров:

pubKey.n  // модуль (RSA)
pubKey.e  // экспонента (RSA)

Проверка подписи сертификата

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

x509.verifySignature(pubKey);

Возвращает true или false.

Процесс включает:

  • извлечение tbsCertificate
  • получение алгоритма подписи
  • вычисление хеша
  • проверку подписи

Работа с ASN.1 внутри X509

Сертификат X.509 — это ASN.1 структура. jsrsasign предоставляет доступ к ней через hex-представление.

var hex = x509.hex;

Навигация по структуре:

ASN1HEX.getTLV(hex, index);
ASN1HEX.getV(hex, index);

Пример извлечения:

var subjectHex = x509.getSubjectHex();

Серийный номер и идентификация

Серийный номер уникально идентифицирует сертификат:

x509.getSerialNumberHex();

Для удобства:

x509.getSerialNumberHex().toUpperCase();

Алгоритмы подписи

Определение алгоритма подписи:

x509.getSignatureAlgorithmName();

Примеры:

  • SHA256withRSA
  • SHA384withECDSA

OID алгоритма:

x509.getSignatureAlgorithmField();

Проверка срока действия

x509.getNotBefore();
x509.getNotAfter();

Проверка:

var now = new Date();
var valid = now >= new Date(x509.getNotBefore()) &&
            now <= new Date(x509.getNotAfter());

Получение fingerprint

Fingerprint используется для идентификации сертификата:

x509.getFingerprint();

Алгоритм по умолчанию — SHA-1, но можно указать:

x509.getFingerprint("sha256");

Работа с CRL и OCSP (ограниченно)

jsrsasign не реализует полноценную проверку CRL/OCSP, но позволяет извлекать соответствующие URL:

x509.getExtCRLDistributionPointsURI();
x509.getExtAIAInfo();

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

PEM → HEX:

var hex = X509.pemToHex(pem);

HEX → PEM:

var pem = KJUR.asn1.ASN1Util.getPEMStringFromHex(hex, "CERTIFICATE");

Валидация цепочки сертификатов

Прямой поддержки полной валидации цепочки нет, но можно реализовать вручную:

  1. Проверка подписи каждого сертификата
  2. Проверка сроков действия
  3. Проверка Basic Constraints
  4. Сопоставление Subject/Issuer

Взаимодействие с другими пространствами имён

X509 тесно связан с:

  • KJUR.crypto — криптография
  • ASN1HEX — разбор ASN.1
  • KEYUTIL — работа с ключами

Пример интеграции:

var key = KEYUTIL.getKey(pemPublicKey);
x509.verifySignature(key);

Внутренние представления данных

Основные внутренние свойства объекта:

  • hex — полный hex сертификата
  • subjectPublicKeyRSA — публичный ключ
  • issuerHex — issuer в hex
  • subjectHex — subject в hex

Это позволяет гибко работать с низкоуровневой структурой.


Особенности реализации

  • Вся работа ведётся в hex-формате
  • ASN.1 разбирается вручную, без внешних зависимостей
  • Нет нативной поддержки WebCrypto — используется собственная реализация

Типичные сценарии использования

Парсинг сертификата

var x509 = new X509();
x509.readCertPEM(pem);
console.log(x509.getSubjectString());

Проверка подписи

var caKey = KEYUTIL.getKey(caPem);
x509.verifySignature(caKey);

Извлечение SAN

var san = x509.getExtSubjectAltName();

Ограничения

  • Нет встроенной проверки доверенной цепочки
  • Ограниченная поддержка CRL/OCSP
  • Производительность ниже нативных решений
  • Требует ручной работы с ASN.1 для сложных случаев

Расширяемость

Библиотека позволяет добавлять собственные методы для обработки специфичных расширений, используя доступ к hex-структуре и ASN.1 утилиты.

Пример:

function getCustomExtension(x509, oid) {
    var ext = x509.getExtInfo(oid);
    return ext ? ext.vidx : null;
}

Резюме архитектуры пространства имён

Пространство имён X509 в jsrsasign построено по принципу:

  • Центральный класс X509
  • ASN.1 как базовое представление
  • Модули криптографии отдельно
  • Методы доступа к данным поверх ASN.1

Такой подход обеспечивает гибкость, но требует глубокого понимания структуры X.509 и ASN.1.