Что такое CRL и зачем он нужен

CRL (Certificate Revocation List) — это список отозванных цифровых сертификатов, публикуемый центром сертификации (CA, Certification Authority). В этот список включаются сертификаты, которые были признаны недействительными до окончания срока их действия.

Каждый элемент CRL содержит:

  • серийный номер сертификата
  • дату отзыва
  • причину отзыва (опционально)
  • дополнительные расширения (например, CRL Entry Extensions)

CRL подписывается самим центром сертификации, что гарантирует его подлинность и целостность.


Причины отзыва сертификатов

Сертификаты могут быть отозваны по нескольким причинам:

  • Компрометация приватного ключа — наиболее критичный случай
  • Ошибка при выпуске сертификата
  • Изменение данных субъекта (например, доменного имени)
  • Прекращение деятельности владельца
  • Нарушение политики безопасности

Причина отзыва может быть закодирована в поле CRLReason, например:

  • keyCompromise
  • caCompromise
  • affiliationChanged
  • superseded
  • cessationOfOperation

Роль CRL в инфраструктуре открытых ключей (PKI)

CRL является важным элементом PKI и используется для проверки актуальности сертификатов. Даже если сертификат формально не истёк, он может быть признан недействительным, если присутствует в CRL.

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

  1. Получение сертификата
  2. Проверку его подписи
  3. Проверку срока действия
  4. Проверку отсутствия в CRL

Если сертификат найден в CRL — он считается недействительным, независимо от других факторов.


Формат CRL

CRL обычно представляется в формате ASN.1 и кодируется с использованием DER (Distinguished Encoding Rules). Основная структура:

CertificateList  ::=  SEQUENCE  {
    tbsCertList          TBSCertList,
    signatureAlgorithm   AlgorithmIdentifier,
    signatureValue       BIT STRING
}

Где:

  • TBSCertList — “to be signed” часть, содержащая данные списка
  • signatureAlgorithm — алгоритм подписи
  • signatureValue — цифровая подпись

Внутри TBSCertList находятся:

  • версия
  • идентификатор алгоритма
  • имя издателя (issuer)
  • время последнего обновления (thisUpdate)
  • время следующего обновления (nextUpdate)
  • список отозванных сертификатов

Распространение CRL

CRL распространяются через различные механизмы:

  • HTTP/HTTPS
  • LDAP
  • встроенные расширения сертификатов (CRL Distribution Points)

В X.509 сертификате может быть указано, где именно получить CRL:

X509v3 CRL Distribution Points:
    Full Name:
        URI:http://example.com/crl.pem

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


Ограничения CRL

Несмотря на широкое применение, CRL имеет ряд недостатков:

  • Размер — при большом количестве отозванных сертификатов список становится громоздким
  • Задержки обновления — CRL обновляется периодически, что создаёт окно уязвимости
  • Нагрузка на сеть — необходимость скачивания полного списка

Для решения этих проблем используются альтернативы:

  • Delta CRL (инкрементальные обновления)
  • OCSP (Online Certificate Status Protocol)

Работа с CRL в Jsrsasign

Библиотека Jsrsasign предоставляет инструменты для работы с CRL, включая парсинг, проверку подписи и извлечение данных.

Загрузка и парсинг CRL

CRL может быть загружен в формате PEM или DER:

const crlPem = `-----BEGIN X509 CRL-----
MIIBYDCB...
-----END X509 CRL-----`;

const crl = new KJUR.asn1.x509.CRL();
crl.readCRLPEM(crlPem);

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

console.log(crl.getIssuer());
console.log(crl.getThisUpdate());
console.log(crl.getNextUpdate());

Получение списка отозванных сертификатов

const revokedList = crl.getRevCertArray();

revokedList.forEach(entry => {
    console.log(entry.sn); // серийный номер
    console.log(entry.time); // дата отзыва
});

Каждый элемент массива содержит:

  • sn — serial number
  • time — время отзыва
  • ext — расширения (если есть)

Проверка наличия сертификата в CRL

function isRevoked(crl, serialNumber) {
    const list = crl.getRevCertArray();
    return list.some(entry => entry.sn === serialNumber);
}

Использование:

const revoked = isRevoked(crl, "0A1B2C3D");

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

Для проверки подлинности CRL необходимо использовать публичный ключ центра сертификации:

const pubKey = KEYUTIL.getKey(caCertPEM);
const isValid = crl.verifySignature(pubKey);

Если подпись невалидна — CRL не должен использоваться.


Связь CRL с X.509 сертификатами

При работе с сертификатами через Jsrsasign можно извлечь URL CRL:

const cert = new X509();
cert.readCertPEM(certPEM);

const crlDP = cert.getExtCRLDistributionPointsURI();
console.log(crlDP);

Это позволяет автоматически загрузить CRL и проверить статус сертификата.


Оптимизация работы с CRL

При использовании CRL в приложениях учитываются следующие практики:

  • кэширование CRL до значения nextUpdate
  • периодическое обновление в фоне
  • использование delta CRL при поддержке
  • комбинирование с OCSP

Сравнение CRL и OCSP

Характеристика CRL OCSP
Тип проверки оффлайн (по списку) онлайн (запрос к серверу)
Объём данных большой минимальный
Актуальность ограничена временем обновления высокая
Задержка низкая (локально) зависит от сети

CRL остаётся важным механизмом, особенно в системах с ограниченным доступом к сети или при необходимости оффлайн-проверки.


Практическое значение

CRL играет критическую роль в обеспечении доверия в системах шифрования и аутентификации. Без механизма отзыва невозможно оперативно реагировать на компрометацию ключей и другие угрозы безопасности.

В контексте Jsrsasign CRL позволяет реализовать полноценную проверку сертификатов на стороне клиента или сервера, дополняя базовую криптографическую функциональность библиотеки.