Расширение CRL Distribution Points

CRL Distribution Points (CDP) относится к расширениям сертификатов X.509, определяющим места, откуда можно загрузить списки отозванных сертификатов (CRL). В контексте jsrsasign это расширение играет ключевую роль при проверке статуса сертификата, позволяя динамически получать актуальные CRL вместо встраивания их в приложение.

Расширение CRL Distribution Points описывает один или несколько источников, где публикуются списки отозванных сертификатов. Каждый источник может быть представлен как URI или как LDAP-адрес.

Ключевые элементы структуры:

  • DistributionPointName — определяет тип и значение точки распространения
  • fullName — набор GeneralName (чаще всего URI)
  • reasons — причины отзыва (используется редко в браузерных сценариях)
  • cRLIssuer — указание издателя CRL (опционально)

Расширение идентифицируется OID:

OID: 2.5.29.31

ASN.1 структура расширения

Формальное представление расширения:

CRLDistributionPoints ::= SEQUENCE SIZE (1..MAX) OF DistributionPoint

DistributionPoint ::= SEQUENCE {
    distributionPoint       [0] DistributionPointName OPTIONAL,
    reasons                 [1] ReasonFlags OPTIONAL,
    cRLIssuer              [2] GeneralNames OPTIONAL
}

DistributionPointName ::= CHOICE {
    fullName               [0] GeneralNames,
    nameRelativeToCRLIssuer [1] RelativeDistinguishedName
}

На практике в большинстве сертификатов используется только fullName с URI.

Типовые значения Distribution Points

Чаще всего встречаются:

  • HTTP URL:

    • http://crl.example.com/intermediate.crl
  • HTTPS URL:

    • https://pki.example.com/crl/root.crl
  • LDAP:

    • ldap://ldap.example.com/cn=exampleCA,dc=example,dc=com

HTTP/HTTPS варианты наиболее распространены в современных PKI.

Извлечение CRL Distribution Points в jsrsasign

В jsrsasign работа с сертификатами выполняется через объект X509. После загрузки сертификата можно получить расширение CDP напрямую.

Базовый сценарий:

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

После загрузки сертификата доступ к CRL Distribution Points осуществляется через метод:

var points = cert.getExtCRLDistributionPoints();

Структура возвращаемых данных

Метод возвращает массив строк, где каждая строка — это URI точки распространения CRL.

Пример результата:

[
  "http://crl.example.com/root.crl",
  "http://crl-backup.example.com/root.crl"
]

Если расширение отсутствует, возвращается пустой массив.

Обработка нескольких Distribution Points

Сертификаты могут содержать несколько источников CRL. Это используется для:

  • резервирования источников
  • распределения нагрузки
  • географической репликации PKI-инфраструктуры

Пример обработки:

var cert = new X509();
cert.readCertPEM(pem);

var crlDPs = cert.getExtCRLDistributionPoints();

for (var i = 0; i < crlDPs.length; i++) {
    console.log("CRL URL:", crlDPs[i]);
}

Проверка доступности CRL

После извлечения URL может выполняться загрузка CRL через HTTP-запрос. jsrsasign не выполняет сетевые операции самостоятельно, поэтому интеграция с транспортным уровнем реализуется отдельно.

Пример логики:

function fetchCRL(url) {
    return fetch(url)
        .then(res => res.arrayBuffer());
}

Далее полученный CRL может быть обработан через X509CRL:

var crl = new X509CRL();
crl.readCertPEM(crlPem);

Особенности кодирования в сертификате

CRL Distribution Points хранится в виде ASN.1 DER encoded extension. Внутри сертификата:

  • Extension OID: 2.5.29.31
  • critical flag: обычно false
  • value: DER SEQUENCE DistributionPoints

jsrsasign автоматически декодирует этот блок при вызове getExtCRLDistributionPoints().

Работа с расширениями через общий API

Помимо специализированного метода, расширения могут быть доступны через универсальный интерфейс:

var ext = cert.getExtInfo();

Однако CRL Distribution Points обычно извлекаются напрямую, так как это наиболее часто используемое PKI-расширение после SAN и Key Usage.

Валидация CRL Distribution Points

При обработке важно учитывать:

  • URI должен быть валидным HTTP/HTTPS адресом
  • LDAP URI требует отдельного клиента
  • наличие нескольких точек не гарантирует актуальность всех источников
  • возможны устаревшие или недоступные ссылки в старых сертификатах

Пример фильтрации:

var validPoints = crlDPs.filter(function(url) {
    return url.startsWith("http://") || url.startsWith("https://");
});

Связь с проверкой отзыва сертификатов

CRL Distribution Points напрямую участвует в процессе проверки цепочки доверия:

  1. Из сертификата извлекается CDP
  2. Загружается CRL
  3. Проверяется серийный номер сертификата в списке отозванных
  4. При совпадении сертификат считается недействительным

В jsrsasign логика проверки обычно строится поверх:

  • X509
  • X509CRL
  • KJUR.crypto

Пример полного сценария анализа CDP

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

// извлечение CRL Distribution Points
var crlPoints = cert.getExtCRLDistributionPoints();

// вывод всех источников
for (var i = 0; i < crlPoints.length; i++) {
    console.log(crlPoints[i]);
}

Особенности интерпретации в разных PKI

Разные удостоверяющие центры используют CDP по-разному:

  • корпоративные PKI часто используют LDAP
  • публичные центры сертификации — HTTP/HTTPS
  • некоторые сертификаты содержат несколько резервных URL

Также встречаются случаи, когда CDP отсутствует, и тогда используется OCSP как альтернативный механизм проверки статуса сертификата.

Ограничения jsrsasign при работе с CDP

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

  • отсутствие встроенного HTTP-клиента
  • отсутствие автоматической проверки CRL
  • необходимость внешней реализации кеширования CRL
  • только парсинг и извлечение данных на уровне ASN.1

CRL Distribution Points в jsrsasign выполняет исключительно информационную роль, предоставляя структуру данных для дальнейшей обработки внешними компонентами системы.