Разбор CRL с помощью KJUR.asn1.x509.CRL

CRL (Certificate Revocation List) представляет собой список отозванных сертификатов, подписанный центром сертификации (CA). В инфраструктуре X.509 он используется для проверки актуальности сертификатов до истечения срока их действия. В JavaScript-библиотеке jsrsasign работа с CRL реализована через KJUR.asn1.x509.CRL, предоставляющий средства для парсинга, анализа и проверки структуры списка отзыва.


CRL в экосистеме X.509 может быть представлен в нескольких форматах:

  • PEM (Base64 с заголовками -----BEGIN X509 CRL-----)
  • DER (бинарный ASN.1)
  • иногда в виде уже распарсенной ASN.1 структуры

Jsrsasign поддерживает оба основных формата и автоматически определяет тип при корректной передаче данных.


Базовая структура CRL

CRL в ASN.1 включает следующие ключевые элементы:

  • tbsCertList — данные списка
  • signatureAlgorithm — алгоритм подписи
  • signatureValue — цифровая подпись CA
  • revokedCertificates — массив отозванных сертификатов
  • thisUpdate — дата создания списка
  • nextUpdate — дата следующего обновления

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

  • userCertificate (серийный номер)
  • revocationDate
  • опционально crlEntryExtensions

Создание и парсинг CRL через KJUR.asn1.x509.CRL

Jsrsasign предоставляет объект CRL, позволяющий работать с содержимым списка отзыва.

Парсинг PEM CRL

const crlPEM = `
-----BEGIN X509 CRL-----
MIIBYDCBygIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJKUDEQMA4GA1UE
...
-----END X509 CRL-----
`;

const crl = new KJUR.asn1.x509.CRL({ pem: crlPEM });

После инициализации объект предоставляет доступ к структуре CRL.


Извлечение основных полей CRL

Информация о издателе (Issuer)

console.log(crl.getIssuerString());

Issuer возвращает строку DN (Distinguished Name), например:

C=RU, O=Example CA, CN=Root CA

Дата обновления списка

console.log(crl.getThisUpdate());
console.log(crl.getNextUpdate());
  • thisUpdate — момент выпуска CRL
  • nextUpdate — срок, до которого CRL считается актуальным

Работа со списком отозванных сертификатов

Главная ценность CRL — список отозванных сертификатов.

const revoked = crl.getRevokedCertArray();
console.log(revoked);

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

  • serial — серийный номер сертификата
  • revocationDate — дата отзыва
  • extensions — дополнительные данные (если присутствуют)

Проверка серийного номера на отзыв

Типичный сценарий — проверка сертификата перед установлением доверия.

function isRevoked(serialNumberHex) {
  const revokedList = crl.getRevokedCertArray();

  return revokedList.some(entry => {
    return entry.serial === serialNumberHex.toUpperCase();
  });
}

Серийный номер обычно сравнивается в hex-формате без префикса 0x.


Получение полной ASN.1 структуры CRL

Для низкоуровневого анализа используется метод декодирования ASN.1:

const asn1 = KJUR.asn1.ASN1Util.getASN1HexFromPEM(crlPEM);
console.log(asn1);

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


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

CRL подписывается CA, и важно убедиться в его подлинности.

const caCertPEM = `-----BEGIN CERTIFICATE-----...`;

const isValid = crl.verifySignature(caCertPEM);
console.log(isValid);

Метод проверяет соответствие signatureValue и signatureAlgorithm с публичным ключом CA.


Разбор расширений CRL (CRL Extensions)

CRL может содержать дополнительные расширения:

  • Authority Key Identifier
  • CRL Number
  • Delta CRL Indicator

Извлечение расширений:

const extensions = crl.getExtInfo();
console.log(extensions);

CRL Number особенно важен для определения актуальности списка.


Работа с Delta CRL

Delta CRL содержит только изменения относительно базового списка.

const delta = crl.getDeltaCRLIndicator();
console.log(delta);

Если значение присутствует, CRL является дельта-обновлением.


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

Хотя CRL остается стандартом, часто используется OCSP для онлайн-проверки статуса сертификата.

Особенности CRL:

  • автономный список
  • может быть большим по размеру
  • подходит для оффлайн проверки

OCSP:

  • запрос в реальном времени
  • меньшая нагрузка на сеть
  • требует доступности сервера CA

Обработка больших CRL

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

Рекомендации:

  • кэшировать распарсенный CRL
  • избегать повторного вызова new KJUR.asn1.x509.CRL
  • использовать индексирование серийных номеров

Пример оптимизации:

const revokedSet = new Set(
  crl.getRevokedCertArray().map(e => e.serial)
);

function check(serial) {
  return revokedSet.has(serial.toUpperCase());
}

Ошибки парсинга CRL

Частые проблемы:

Некорректный PEM формат

Если отсутствуют заголовки:

Error: malformed PEM format

Поврежденный ASN.1

Error: ASN.1 parse error

Несовпадение подписи

Signature verification failed

Конвертация DER в CRL объект

Если CRL представлен в бинарном виде:

const crl = new KJUR.asn1.x509.CRL({ der: derHex });

DER должен быть hex-строкой.


Использование в системах проверки сертификатов

Типичный поток проверки:

  1. Получение CRL от CA
  2. Парсинг через KJUR.asn1.x509.CRL
  3. Извлечение списка серийных номеров
  4. Проверка сертификата клиента
  5. Блокировка при совпадении

Получение CRL Number

const crlNumber = crl.getCRLNumber();
console.log(crlNumber);

CRL Number позволяет определить, является ли список актуальным по сравнению с предыдущими версиями.


Разбор даты отзыва сертификата

Каждая запись CRL содержит дату отзыва:

const revoked = crl.getRevokedCertArray();

revoked.forEach(entry => {
  console.log(entry.serial);
  console.log(entry.revocationDate);
});

Дата может использоваться для аудита безопасности и анализа инцидентов.


Фильтрация отозванных сертификатов по времени

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

function revokedAfter(date) {
  return crl.getRevokedCertArray().filter(entry => {
    return new Date(entry.revocationDate) > date;
  });
}

Практическое применение CRL в клиентской логике

При проверке TLS-соединений или подписей документов CRL используется как локальный источник доверия. Jsrsasign позволяет интегрировать этот процесс прямо в JavaScript-логику без обращения к внешним сервисам.


Особенности работы с различными CA

CRL от разных центров сертификации могут отличаться:

  • разные политики обновления
  • разные интервалы nextUpdate
  • различная глубина расширений

Jsrsasign абстрагирует эти различия, предоставляя единый интерфейс доступа к данным через KJUR.asn1.x509.CRL.


Валидация структуры CRL перед использованием

Перед обработкой целесообразно проверить корректность:

try {
  const crl = new KJUR.asn1.x509.CRL({ pem: crlPEM });
  console.log("CRL корректен");
} catch (e) {
  console.error("Ошибка CRL", e);
}

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