Реестр OID в jsrsasign: KJUR.asn1.x509.OID

OID (Object Identifier) представляет собой фундаментальный механизм идентификации алгоритмов, атрибутов и структур данных в ASN.1 и X.509. В криптографических системах OID используются для строгого и однозначного определения сущностей: алгоритмов хеширования, подписей, расширений сертификатов, полей субъектов и множества других элементов инфраструктуры PKI.

В jsrsasign работа с OID централизована в пространстве имён KJUR.asn1.x509.OID, которое реализует реестр соответствий между строковыми именами и числовыми идентификаторами OID. Этот реестр позволяет выполнять двунаправленное преобразование, обеспечивая удобство разработки при работе с сертификатами, ASN.1 структурами и криптографическими объектами.


Основная задача реестра OID заключается в том, чтобы связать человекочитаемые идентификаторы (например, sha256, rsaEncryption, commonName) с их ASN.1-эквивалентами вида 2.16.840.1.101.3.4.2.1. Такая абстракция критически важна, поскольку напрямую работать с числовыми OID неудобно и подвержено ошибкам.


Структура KJUR.asn1.x509.OID организована как глобальный статический объект, содержащий внутренние таблицы соответствий:

  • имя → OID
  • OID → имя

Эта двунаправленная модель позволяет использовать библиотеку как при генерации сертификатов, так и при их анализе.


Основные методы реестра OID

В KJUR.asn1.x509.OID реализован набор функций для взаимодействия с таблицей идентификаторов.

Метод преобразует строковое имя алгоритма или атрибута в числовой идентификатор.

var oid = KJUR.asn1.x509.OID.name2oid("sha256");
console.log(oid);
// 2.16.840.1.101.3.4.2.1

Внутри реестра поддерживаются стандартные криптографические и X.509-атрибуты, включая:

  • sha1, sha256, sha512
  • rsaEncryption
  • commonName
  • countryName
  • organizationName

Получение имени по OID

Обратная операция позволяет интерпретировать ASN.1 структуры:

var name = KJUR.asn1.x509.OID.oid2name("2.5.4.3");
console.log(name);
// commonName

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


Проверка существования OID

Реестр позволяет проверить наличие записи:

var exists = KJUR.asn1.x509.OID.oid2name("1.2.3.4") !== null;

Такая проверка используется при обработке нестандартных или расширенных OID, которые могут отсутствовать в стандартной базе jsrsasign.


Расширение реестра OID

Одной из ключевых возможностей является добавление пользовательских OID. Это важно при работе с корпоративными PKI, нестандартными расширениями сертификатов или собственными криптографическими схемами.

Добавление выполняется через регистрацию:

KJUR.asn1.x509.OID.register("1.2.3.4.5.6", "customAlgorithm");

После регистрации становятся доступны обе операции:

KJUR.asn1.x509.OID.name2oid("customAlgorithm");
// 1.2.3.4.5.6

KJUR.asn1.x509.OID.oid2name("1.2.3.4.5.6");
// customAlgorithm

Поведение реестра основано на простой таблице соответствий, однако при расширении важно учитывать конфликт имён. Если одно и то же имя регистрируется повторно с другим OID, последнее значение перезапишет предыдущее.


OID в контексте X.509 сертификатов

При генерации сертификатов X.509 OID используются для определения:

  • полей субъекта (Subject DN)
  • алгоритма подписи
  • расширений сертификата
  • ключевых идентификаторов

Пример использования в структуре сертификата:

var cert = new X509();
cert.setSubject({
    C: "US",
    O: "Example Org",
    CN: "example.com"
});

Внутри jsrsasign эти атрибуты автоматически преобразуются в OID:

  • C → 2.5.4.6
  • O → 2.5.4.10
  • CN → 2.5.4.3

Реестр KJUR.asn1.x509.OID обеспечивает это сопоставление.


Взаимодействие с ASN.1 объектами

При формировании ASN.1 структур OID представляется как объект типа ASN1ObjectIdentifier. jsrsasign использует реестр для корректной кодировки:

var asn1Oid = new KJUR.asn1.ASN1ObjectIdentifier({
    oid: KJUR.asn1.x509.OID.name2oid("sha256")
});

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


Внутренняя организация таблиц

Реестр OID в jsrsasign построен на основе двух словарей:

  • name2oidMap
  • oid2nameMap

Каждое добавление через register синхронно обновляет обе структуры. Это обеспечивает постоянную согласованность данных и ускоряет доступ по ключу.


Особенности стандартного набора OID

В стандартной поставке jsrsasign уже присутствует большой набор предопределённых значений. Среди них:

Алгоритмы:

  • SHA-1
  • SHA-256
  • SHA-384
  • SHA-512
  • RSA
  • ECDSA

Атрибуты X.500:

  • commonName
  • countryName
  • localityName
  • organizationName
  • organizationalUnitName

Расширения сертификатов:

  • subjectAltName
  • keyUsage
  • extendedKeyUsage

Каждый из них связан с соответствующим числовым OID, используемым в ASN.1 кодировке.


Использование OID при валидации сертификатов

При проверке сертификатов реестр используется для интерпретации структуры subject, issuer и extensions. Например:

var oid = "2.5.29.15";
var name = KJUR.asn1.x509.OID.oid2name(oid);

Результат:

  • keyUsage

Это позволяет анализировать сертификаты без обращения к внешним справочникам OID.


Преобразование OID в процессе криптографических операций

Во время создания цифровой подписи OID определяет алгоритм хеширования:

var sigAlgOid = KJUR.asn1.x509.OID.name2oid("sha256withRSAEncryption");

Затем этот OID помещается в структуру AlgorithmIdentifier внутри сертификата.


Обработка неизвестных OID

Если OID отсутствует в реестре, методы возвращают null. Такая ситуация часто возникает при работе с:

  • проприетарными расширениями
  • новыми криптографическими стандартами
  • устаревшими сертификатами

В этих случаях допустимо расширение реестра через register, что обеспечивает динамическую адаптацию системы без модификации ядра библиотеки.


Роль OID в совместимости PKI

Использование централизованного реестра OID позволяет jsrsasign поддерживать совместимость с различными реализациями PKI, включая OpenSSL, Java Keytool и браузерные криптографические API. Унификация идентификаторов обеспечивает корректное чтение и генерацию сертификатов между различными платформами.


Стабильность и предсказуемость реестра OID особенно важны при сериализации ASN.1 структур, где любое несоответствие идентификаторов приводит к невозможности проверки подписи или чтения сертификата.