Модуль asn1ocsp библиотеки Jsrsasign реализует работу с
ASN.1-структурами протокола OCSP (Online Certificate Status
Protocol). Этот протокол применяется для проверки статуса
X.509-сертификатов в режиме реального времени без необходимости загрузки
списков отзыва (CRL).
Модуль предоставляет инструменты для:
OCSP основан на ASN.1-описаниях, определённых в RFC 6960. Модуль
asn1ocsp реализует ключевые структуры:
Содержит:
tbsRequest (to-be-signed запрос)optionalSignature (необязательная подпись)Структура запроса:
OCSPRequest ::= SEQUENCE {
tbsRequest TBSRequest,
optionalSignature [0] EXPLICIT Signature OPTIONAL
}
Включает:
Ключевая структура, определяющая сертификат:
Модуль реализован через пространство имён:
KJUR.asn1.ocsp
Ключевые классы:
OCSPRequestСоздание запроса:
new KJUR.asn1.ocsp.OCSPRequest(params)
Параметры:
reqList — массив объектов Requestsig — подпись (опционально)TBSRequestnew KJUR.asn1.ocsp.TBSRequest(params)
Параметры:
reqList — список запросовrequestorName — имя запрашивающего (опционально)Requestnew KJUR.asn1.ocsp.Request(params)
Параметры:
reqCert — объект CertIDCertIDnew KJUR.asn1.ocsp.CertID(params)
Параметры:
alg — алгоритм хеширования (например, “sha1”)issuerNameHashissuerKeyHashserialNumberOCSPResponsenew KJUR.asn1.ocsp.OCSPResponse(params)
Содержит:
BasicOCSPResponsenew KJUR.asn1.ocsp.BasicOCSPResponse(params)
Содержит:
tbsResponseDatasignatureAlgorithmsignaturecerts (опционально)Формирование запроса включает несколько этапов:
var certID = new KJUR.asn1.ocsp.CertID({
alg: "sha1",
issuerNameHash: "ab12cd...",
issuerKeyHash: "34ef56...",
serialNumber: "01AB"
});
var request = new KJUR.asn1.ocsp.Request({
reqCert: certID
});
var tbsRequest = new KJUR.asn1.ocsp.TBSRequest({
reqList: [request]
});
var ocspReq = new KJUR.asn1.ocsp.OCSPRequest({
reqList: [request]
});
var derHex = ocspReq.getEncodedHex();
Модуль позволяет разбирать DER-кодированные ответы:
var ocspRes = new KJUR.asn1.ocsp.OCSPResponse();
ocspRes.readASN1HexString(hexString);
После разбора доступны:
Ответ содержит поле responseStatus, которое может
принимать значения:
0 — successful1 — malformedRequest2 — internalError3 — tryLater5 — sigRequired6 — unauthorizedВнутри успешного ответа:
OCSPResponse → responseBytes → BasicOCSPResponse
Извлечение:
var basic = ocspRes.getBasicOCSPResponse();
Содержимое:
SingleResponseКаждый элемент содержит:
Статус определяется ASN.1 выбором:
CertStatus ::= CHOICE {
good [0] IMPLICIT NULL,
revoked [1] IMPLICIT RevokedInfo,
unknown [2] IMPLICIT UnknownInfo
}
BasicOCSPResponse содержит подпись:
signatureAlgorithm
signature
Проверка выполняется с использованием открытого ключа:
var isValid = basic.verify(signaturePublicKey);
Создание ответа требует:
ResponseDataПример:
var basicRes = new KJUR.asn1.ocsp.BasicOCSPResponse({
tbsResponseData: responseData,
sigAlg: "SHA256withRSA",
sigHex: signatureHex,
certs: [certHex]
});
Все структуры кодируются в DER:
var hex = object.getEncodedHex();
Особенности:
Для идентификации сертификата применяются:
Получение значений:
issuerNameHash — хеш DN издателяissuerKeyHash — хеш публичного ключаМодуль тесно связан с:
KJUR.asn1.x509
Используется для:
application/ocsp-requestapplication/ocsp-responsethisUpdate,
nextUpdate)asn1x509 — работа с сертификатамиcrypto — подпись и проверкаrsasign — криптографические операцииМодуль поддерживает ASN.1-расширения:
Добавление расширения:
ext: [{ extname: "nonce", hex: "..." }]
Полезные методы:
object.getEncodedHex()
Анализ через сторонние инструменты:
OCSP является альтернативой CRL и обеспечивает:
Модуль asn1ocsp позволяет полностью реализовать
клиентскую и частично серверную сторону OCSP в JavaScript-среде.