CRL (Certificate Revocation List) представляет собой список
отозванных сертификатов, подписанный центром сертификации (CA). В
инфраструктуре X.509 он используется для проверки актуальности
сертификатов до истечения срока их действия. В JavaScript-библиотеке
jsrsasign работа с CRL реализована через
KJUR.asn1.x509.CRL, предоставляющий средства для парсинга,
анализа и проверки структуры списка отзыва.
CRL в экосистеме X.509 может быть представлен в нескольких форматах:
-----BEGIN X509 CRL-----)Jsrsasign поддерживает оба основных формата и автоматически определяет тип при корректной передаче данных.
CRL в ASN.1 включает следующие ключевые элементы:
tbsCertList — данные спискаsignatureAlgorithm — алгоритм подписиsignatureValue — цифровая подпись CArevokedCertificates — массив отозванных
сертификатовthisUpdate — дата создания спискаnextUpdate — дата следующего обновленияКаждый элемент отозванного сертификата содержит:
userCertificate (серийный номер)revocationDatecrlEntryExtensionsJsrsasign предоставляет объект CRL, позволяющий работать с содержимым списка отзыва.
const crlPEM = `
-----BEGIN X509 CRL-----
MIIBYDCBygIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJKUDEQMA4GA1UE
...
-----END X509 CRL-----
`;
const crl = new KJUR.asn1.x509.CRL({ pem: crlPEM });
После инициализации объект предоставляет доступ к структуре CRL.
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 — момент выпуска CRLnextUpdate — срок, до которого 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:
const asn1 = KJUR.asn1.ASN1Util.getASN1HexFromPEM(crlPEM);
console.log(asn1);
Это позволяет получить сырой ASN.1 hex, полезный при отладке или разработке криптографических инструментов.
CRL подписывается CA, и важно убедиться в его подлинности.
const caCertPEM = `-----BEGIN CERTIFICATE-----...`;
const isValid = crl.verifySignature(caCertPEM);
console.log(isValid);
Метод проверяет соответствие signatureValue и
signatureAlgorithm с публичным ключом CA.
CRL может содержать дополнительные расширения:
Извлечение расширений:
const extensions = crl.getExtInfo();
console.log(extensions);
CRL Number особенно важен для определения актуальности списка.
Delta CRL содержит только изменения относительно базового списка.
const delta = crl.getDeltaCRLIndicator();
console.log(delta);
Если значение присутствует, CRL является дельта-обновлением.
Хотя CRL остается стандартом, часто используется OCSP для онлайн-проверки статуса сертификата.
Особенности CRL:
OCSP:
При работе с крупными списками отзывов важно учитывать производительность.
Рекомендации:
new KJUR.asn1.x509.CRLПример оптимизации:
const revokedSet = new Set(
crl.getRevokedCertArray().map(e => e.serial)
);
function check(serial) {
return revokedSet.has(serial.toUpperCase());
}
Частые проблемы:
Если отсутствуют заголовки:
Error: malformed PEM format
Error: ASN.1 parse error
Signature verification failed
Если CRL представлен в бинарном виде:
const crl = new KJUR.asn1.x509.CRL({ der: derHex });
DER должен быть hex-строкой.
Типичный поток проверки:
KJUR.asn1.x509.CRLconst 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;
});
}
При проверке TLS-соединений или подписей документов CRL используется как локальный источник доверия. Jsrsasign позволяет интегрировать этот процесс прямо в JavaScript-логику без обращения к внешним сервисам.
CRL от разных центров сертификации могут отличаться:
nextUpdateJsrsasign абстрагирует эти различия, предоставляя единый интерфейс
доступа к данным через KJUR.asn1.x509.CRL.
Перед обработкой целесообразно проверить корректность:
try {
const crl = new KJUR.asn1.x509.CRL({ pem: crlPEM });
console.log("CRL корректен");
} catch (e) {
console.error("Ошибка CRL", e);
}
Это позволяет безопасно интегрировать CRL в критические системы безопасности.