OCSP (Online Certificate Status Protocol) response представляет собой ASN.1-структуру, закодированную в DER, которая используется для проверки статуса X.509-сертификата в режиме реального времени. В контексте JavaScript-библиотеки jsrsasign работа с OCSP-ответами основана на разборе и генерации ASN.1-дерева, а также на интерпретации вложенных структур, описанных в RFC 6960.
На верхнем уровне OCSP-ответ описывается конструкцией:
OCSPResponse
OCSPResponse ::= SEQUENCE {
responseStatus OCSPResponseStatus,
responseBytes [0] EXPLICIT ResponseBytes OPTIONAL
}
Поле responseStatus определяет результат обработки
OCSP-запроса сервером. Это целое значение ENUMERATED-типа:
В jsrsasign это поле извлекается через ASN.1-декодирование и интерпретируется как числовой статус до обработки основного ответа.
Основная полезная информация содержится в responseBytes,
внутри которого размещается структура
BasicOCSPResponse.
ResponseBytes ::= SEQUENCE {
responseType OBJECT IDENTIFIER,
response OCTET STRING
}
Тип responseType почти всегда равен:
response содержит DER-кодированный
BasicOCSPResponse.
BasicOCSPResponse ::= SEQUENCE {
tbsResponseData ResponseData,
signatureAlgorithm AlgorithmIdentifier,
signature BIT STRING,
certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL
}
Эта структура является ядром OCSP-ответа и содержит как данные о статусе сертификата, так и цифровую подпись OCSP-ответчика.
ResponseData — это подписываемая часть OCSP-ответа (To
Be Signed).
ResponseData ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1,
responderID ResponderID,
producedAt GeneralizedTime,
responses SEQUENCE OF SingleResponse,
responseExtensions [1] EXPLICIT Extensions OPTIONAL
}
Определяет OCSP-ответчика:
В jsrsasign при разборе используется сопоставление с сертификатом OCSP-сервера, если он включён в ответ.
Временная метка генерации OCSP-ответа. Используется для проверки актуальности ответа.
Каждый проверяемый сертификат представлен структурой
SingleResponse.
SingleResponse ::= SEQUENCE {
certID CertID,
certStatus CertStatus,
thisUpdate GeneralizedTime,
nextUpdate [0] EXPLICIT GeneralizedTime OPTIONAL,
singleExtensions [1] EXPLICIT Extensions OPTIONAL
}
Идентификатор сертификата формируется на основе:
В jsrsasign CertID сопоставляется с исходным
сертификатом через вычисление хэшей издателя.
Ключевое поле, определяющее статус сертификата:
CertStatus ::= CHOICE {
good [0] IMPLICIT NULL,
revoked [1] IMPLICIT RevokedInfo,
unknown [2] IMPLICIT UnknownInfo
}
Сертификат действителен, отзыв отсутствует.
Сертификат отозван:
RevokedInfo ::= SEQUENCE {
revocationTime GeneralizedTime,
revocationReason [0] EXPLICIT CRLReason OPTIONAL
}
Поле revocationTime фиксирует момент отзыва, а
CRLReason уточняет причину (keyCompromise, CACompromise и
др.).
Статус неизвестен OCSP-ответчику.
thisUpdate — время актуальности текущего статусаnextUpdate — предполагаемое время следующего
обновленияЭти поля используются для контроля “свежести” OCSP-ответа.
Подпись в BasicOCSPResponse гарантирует целостность
данных.
signatureAlgorithm AlgorithmIdentifier
signature BIT STRING
Алгоритмы подписи включают:
В jsrsasign проверка подписи выполняется через сопоставление
tbsResponseData и signature с использованием
публичного ключа OCSP-ответчика.
Поле certs может содержать цепочку сертификатов
OCSP-ответчика, необходимую для проверки подписи:
В jsrsasign эти данные используются для построения временной цепочки доверия.
В jsrsasign OCSP-ответ разбирается через ASN.1-парсеры:
ASN1HEX — низкоуровневый разбор DER-структурX509 — работа с сертификатамиKJUR.asn1.ocsp — формирование и обработка OCSP-запросов
и ответовТипичный процесс декодирования включает:
OCSPResponse.responseStatusresponseBytesBasicOCSPResponseResponseDataSingleResponse для каждого сертификатаВ jsrsasign результат интерпретируется в удобную структуру:
Пример логической модели:
CertStatus:
serialNumber
status
thisUpdate
nextUpdate
revocationTime (optional)
OCSP полностью основан на DER-кодировании ASN.1:
Ошибки декодирования в jsrsasign чаще всего связаны с:
OCSP-ответ всегда привязан к:
В jsrsasign это выражается через вычисление:
Эти значения должны совпадать между запросом и ответом, иначе
CertID не считается валидным.
Поле времени в OCSP критично для доверия к ответу:
thisUpdate делает ответ
недействительнымnextUpdate требует осторожной
интерпретацииВ jsrsasign часто применяется локальная валидация временных интервалов при интерпретации результата.
Обобщённая логика: