Модуль asn1ocsp

Модуль asn1ocsp библиотеки Jsrsasign реализует работу с ASN.1-структурами протокола OCSP (Online Certificate Status Protocol). Этот протокол применяется для проверки статуса X.509-сертификатов в режиме реального времени без необходимости загрузки списков отзыва (CRL).

Модуль предоставляет инструменты для:

  • формирования OCSP-запросов (OCSPRequest)
  • разбора и создания OCSP-ответов (OCSPResponse)
  • работы с внутренними ASN.1-структурами протокола
  • кодирования и декодирования DER-формата

Основные ASN.1 структуры OCSP

OCSP основан на ASN.1-описаниях, определённых в RFC 6960. Модуль asn1ocsp реализует ключевые структуры:

OCSPRequest

Содержит:

  • tbsRequest (to-be-signed запрос)
  • optionalSignature (необязательная подпись)

Структура запроса:

OCSPRequest ::= SEQUENCE {
   tbsRequest                  TBSRequest,
   optionalSignature   [0]     EXPLICIT Signature OPTIONAL
}

TBSRequest

Включает:

  • версию
  • идентификатор запрашиваемого сертификата (CertID)
  • список запросов

CertID

Ключевая структура, определяющая сертификат:

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

Классы модуля asn1ocsp

Модуль реализован через пространство имён:

KJUR.asn1.ocsp

Ключевые классы:

1. OCSPRequest

Создание запроса:

new KJUR.asn1.ocsp.OCSPRequest(params)

Параметры:

  • reqList — массив объектов Request
  • sig — подпись (опционально)

2. TBSRequest

new KJUR.asn1.ocsp.TBSRequest(params)

Параметры:

  • reqList — список запросов
  • requestorName — имя запрашивающего (опционально)

3. Request

new KJUR.asn1.ocsp.Request(params)

Параметры:

  • reqCert — объект CertID

4. CertID

new KJUR.asn1.ocsp.CertID(params)

Параметры:

  • alg — алгоритм хеширования (например, “sha1”)
  • issuerNameHash
  • issuerKeyHash
  • serialNumber

5. OCSPResponse

new KJUR.asn1.ocsp.OCSPResponse(params)

Содержит:

  • статус ответа
  • базовый ответ (BasicOCSPResponse)

6. BasicOCSPResponse

new KJUR.asn1.ocsp.BasicOCSPResponse(params)

Содержит:

  • tbsResponseData
  • signatureAlgorithm
  • signature
  • certs (опционально)

Создание OCSP-запроса

Формирование запроса включает несколько этапов:

1. Подготовка CertID

var certID = new KJUR.asn1.ocsp.CertID({
  alg: "sha1",
  issuerNameHash: "ab12cd...",
  issuerKeyHash: "34ef56...",
  serialNumber: "01AB"
});

2. Создание Request

var request = new KJUR.asn1.ocsp.Request({
  reqCert: certID
});

3. Формирование TBSRequest

var tbsRequest = new KJUR.asn1.ocsp.TBSRequest({
  reqList: [request]
});

4. Создание OCSPRequest

var ocspReq = new KJUR.asn1.ocsp.OCSPRequest({
  reqList: [request]
});

5. Получение DER-кодировки

var derHex = ocspReq.getEncodedHex();

Декодирование OCSP-ответа

Модуль позволяет разбирать DER-кодированные ответы:

var ocspRes = new KJUR.asn1.ocsp.OCSPResponse();
ocspRes.readASN1HexString(hexString);

После разбора доступны:

  • статус ответа
  • данные сертификата
  • подпись

Статусы OCSP

Ответ содержит поле responseStatus, которое может принимать значения:

  • 0 — successful
  • 1 — malformedRequest
  • 2 — internalError
  • 3 — tryLater
  • 5 — sigRequired
  • 6 — unauthorized

Работа с BasicOCSPResponse

Внутри успешного ответа:

OCSPResponse → responseBytes → BasicOCSPResponse

Извлечение:

var basic = ocspRes.getBasicOCSPResponse();

Содержимое:

  • список SingleResponse
  • время ответа
  • подпись

SingleResponse

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

  • статус сертификата (good, revoked, unknown)
  • время проверки
  • время следующей проверки

Статус определяется ASN.1 выбором:

CertStatus ::= CHOICE {
    good        [0]     IMPLICIT NULL,
    revoked     [1]     IMPLICIT RevokedInfo,
    unknown     [2]     IMPLICIT UnknownInfo
}

Подпись OCSP-ответа

BasicOCSPResponse содержит подпись:

signatureAlgorithm
signature

Проверка выполняется с использованием открытого ключа:

var isValid = basic.verify(signaturePublicKey);

Генерация подписанного OCSP-ответа

Создание ответа требует:

  1. Подготовки ResponseData
  2. Подписания с использованием приватного ключа
  3. Указания алгоритма подписи

Пример:

var basicRes = new KJUR.asn1.ocsp.BasicOCSPResponse({
  tbsResponseData: responseData,
  sigAlg: "SHA256withRSA",
  sigHex: signatureHex,
  certs: [certHex]
});

Кодирование и формат DER

Все структуры кодируются в DER:

var hex = object.getEncodedHex();

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

  • строгий бинарный формат
  • используется в TLS и PKI
  • совместим с OpenSSL

Использование хешей в CertID

Для идентификации сертификата применяются:

  • SHA-1 (по умолчанию в OCSP)
  • SHA-256 (в новых реализациях)

Получение значений:

  • issuerNameHash — хеш DN издателя
  • issuerKeyHash — хеш публичного ключа

Интеграция с X.509

Модуль тесно связан с:

KJUR.asn1.x509

Используется для:

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

Типичный сценарий использования

  1. Получение сертификата и его издателя
  2. Вычисление CertID
  3. Формирование OCSP-запроса
  4. Отправка на OCSP-сервер
  5. Получение DER-ответа
  6. Разбор ответа
  7. Проверка подписи
  8. Анализ статуса сертификата

Особенности реализации в Jsrsasign

  • полностью реализован ASN.1 на JavaScript
  • не требует внешних зависимостей
  • поддерживает браузер и Node.js
  • работает с hex-представлением данных

Ограничения

  • отсутствует встроенный HTTP-клиент для отправки OCSP-запросов
  • требуется ручная работа с DER и hex
  • ограниченная автоматизация проверки цепочки сертификатов

Практические замечания

  • OCSP-запросы обычно отправляются через POST с application/ocsp-request
  • ответы — application/ocsp-response
  • важно учитывать временные поля (thisUpdate, nextUpdate)
  • кэширование ответов может снижать нагрузку

Взаимодействие с другими модулями Jsrsasign

  • asn1x509 — работа с сертификатами
  • crypto — подпись и проверка
  • rsasign — криптографические операции

Расширения OCSP

Модуль поддерживает ASN.1-расширения:

  • nonce (защита от replay-атак)
  • дополнительные атрибуты

Добавление расширения:

ext: [{ extname: "nonce", hex: "..." }]

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

  • операции с ASN.1 могут быть ресурсоёмкими
  • рекомендуется использовать WebCrypto API для тяжёлых вычислений
  • проверка подписи обязательна для доверия к ответу

Отладка ASN.1 структур

Полезные методы:

object.getEncodedHex()

Анализ через сторонние инструменты:

  • openssl asn1parse
  • online ASN.1 decoders

Типичные ошибки

  • неверный хеш алгоритма
  • несовпадение issuerKeyHash
  • неправильный формат DER
  • отсутствие проверки подписи

Роль OCSP в инфраструктуре PKI

OCSP является альтернативой CRL и обеспечивает:

  • быстрый отклик
  • меньший трафик
  • актуальность статуса сертификата

Модуль asn1ocsp позволяет полностью реализовать клиентскую и частично серверную сторону OCSP в JavaScript-среде.