CRL (Certificate Revocation List) — это список отозванных цифровых сертификатов, публикуемый центром сертификации (CA, Certification Authority). В этот список включаются сертификаты, которые были признаны недействительными до окончания срока их действия.
Каждый элемент CRL содержит:
CRL подписывается самим центром сертификации, что гарантирует его подлинность и целостность.
Сертификаты могут быть отозваны по нескольким причинам:
Причина отзыва может быть закодирована в поле CRLReason,
например:
keyCompromisecaCompromiseaffiliationChangedsupersededcessationOfOperationCRL является важным элементом PKI и используется для проверки актуальности сертификатов. Даже если сертификат формально не истёк, он может быть признан недействительным, если присутствует в 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 находятся:
thisUpdate)nextUpdate)CRL распространяются через различные механизмы:
CRL Distribution Points)В X.509 сертификате может быть указано, где именно получить CRL:
X509v3 CRL Distribution Points:
Full Name:
URI:http://example.com/crl.pem
Это позволяет автоматически загружать актуальные списки при проверке.
Несмотря на широкое применение, CRL имеет ряд недостатков:
Для решения этих проблем используются альтернативы:
Библиотека Jsrsasign предоставляет инструменты для работы с 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 numbertime — время отзываext — расширения (если есть)function isRevoked(crl, serialNumber) {
const list = crl.getRevCertArray();
return list.some(entry => entry.sn === serialNumber);
}
Использование:
const revoked = isRevoked(crl, "0A1B2C3D");
Для проверки подлинности CRL необходимо использовать публичный ключ центра сертификации:
const pubKey = KEYUTIL.getKey(caCertPEM);
const isValid = crl.verifySignature(pubKey);
Если подпись невалидна — CRL не должен использоваться.
При работе с сертификатами через Jsrsasign можно извлечь URL CRL:
const cert = new X509();
cert.readCertPEM(certPEM);
const crlDP = cert.getExtCRLDistributionPointsURI();
console.log(crlDP);
Это позволяет автоматически загрузить CRL и проверить статус сертификата.
При использовании CRL в приложениях учитываются следующие практики:
nextUpdate| Характеристика | CRL | OCSP |
|---|---|---|
| Тип проверки | оффлайн (по списку) | онлайн (запрос к серверу) |
| Объём данных | большой | минимальный |
| Актуальность | ограничена временем обновления | высокая |
| Задержка | низкая (локально) | зависит от сети |
CRL остаётся важным механизмом, особенно в системах с ограниченным доступом к сети или при необходимости оффлайн-проверки.
CRL играет критическую роль в обеспечении доверия в системах шифрования и аутентификации. Без механизма отзыва невозможно оперативно реагировать на компрометацию ключей и другие угрозы безопасности.
В контексте Jsrsasign CRL позволяет реализовать полноценную проверку сертификатов на стороне клиента или сервера, дополняя базовую криптографическую функциональность библиотеки.