Microsoft OCSP Check (OCSP vs Lightweight OCSP) и непонятные ответы от "certutil -url"

Обычный OCSP (RFC 6960)

Я написал Ответчик OCSP, где Ответ основывался на RFC 6960, в котором говорится, что:

Если nextUpdate не установлено, респондент указывает, что более новая информация об отзыве доступна постоянно.

Поэтому я не установил nextUpdate и просто использовал BouncyCastle BasicOCSPRespBuilder как здесь (который устанавливает thisUpdate по умолчанию, что также видно в Wireshark Capture):

basicOCSPRespBuilder.addResponse(certID, responseList.get(certID));

Но эти ответы были отклонены аутентификатором сертификата в IIS. При попытке certutil статус ответа всегда был "Истек".

Это было проверено с помощью команды "certutil -url ".

Легкий OCSP (RFC 5019)

Немного погуглив, выяснилось, что Microsoft поддерживает облегченный OCSP согласно RFC 5019, который гласит:

Клиенты ДОЛЖНЫ проверять наличие поля nextUpdate и ДОЛЖНЫ обеспечивать, чтобы текущее время, выраженное в времени по Гринвичу, как описано в разделе 2.2.4, находилось между значениями thisUpdate и nextUpdate. Если поле nextUpdate отсутствует, клиент ДОЛЖЕН отклонить ответ.

Поэтому я изменил реализацию, включив в нее дату следующего обновления (через несколько минут), как показано ниже:

basicOCSPRespBuilder.addResponse(certID, responseList.get(certID), getNextUpdateDate(), null);

Это избавило меня от проблемы состояния "Истек срок действия", но теперь проблема заключается в том, что при развертывании на веб-сервере и попытке выполнить проверку "certutil -url " он возвращает "Проверено" для ссылки WebProxy в сертификате, но если я предоставлю URL-адрес сервера напрямую, он отобразит "ОК". Структура ответа остается одинаковой в обоих случаях, так как это один и тот же респондент (проверено с помощью Wireshark Capture, я мог бы прикрепить это также, если хотите).

поле IssueKeyHash

Интересным фактом здесь является то, что запросы OCSP, отправленные на сервер, отличаются в случае использования через WebProxy и прямой URL. Разница в том, что запрос OCSP не включает issuerKeyHash при отправке запроса по прямой ссылке.

Wireshark перехватывает запрос OCSP, отправленный Webproxy, который возвратил "Проверено":-

Wireshark Capture of OCSP Запрос отправлен по прямой ссылке, которая вернула статус "ОК":-

Вопрос заключается в том, почему запрос включает в один и тот же ключ IssueKeyHash, а в другом - нет. Кроме того, почему Состояние не одинаково для обоих запросов, даже несмотря на то, что Ответ OCSP от Сервера одинаков (подтверждено Wireshark Caputres).

Я также был бы признателен за любую полезную документацию / ссылку для "инструмента поиска URL" или "certutil -verify" в этом отношении.

Я также могу включить захваты Wireshark по запросу.

Я не включил Java и Bouncycastle в качестве тегов, так как ответы OCSP принимаются Java, openssl и т. Д. Без каких-либо проблем (с или без nextUpdate согласно RFC 6960). Этот вопрос предназначен для понимания того, что происходит с Microsoft certutil и проверкой OCSP здесь.

Обновление № 1

--- Начните обновление #1 ---

По предложению @ Crypt32; Я мог убедиться, что при использовании URL-адреса в поле URL-адреса полный путь к сертификату не создается по неизвестным причинам и, следовательно, из-за отсутствия IssuerKeyHash,

Предполагалось, что ответ всегда содержит IssuerKeyHash и это может привести к статусу "ОК" вместо "Подтверждено". Чтобы подтвердить это, я изменил ответ в соответствии с запросом и не отправил IssuerKeyHash если он не был доставлен в Запросе, но статус остался "ОК" и не изменился на "Подтверждено".

Идея состоит в том, чтобы правильно понять, как Приложения Microsoft обрабатывают Ответы OCSP и как правильно реализовать Ответчик, чтобы Приложения Microsoft не падали им на лицо.

Исследования продолжаются, любые советы и предложения приветствуются!

--- Конец обновления #1 ---

2 ответа

Решение

Число рейнольдса nextUpdate

Microsoft использует облегченный OCSP и, следовательно, требует thisUpdate а также nextUpdate в обязательном порядке, как указано в RFC 5019.

Число рейнольдса Certutil

Запрос относительно certutil теперь был разъяснен благодаря @Crypt32.

Число рейнольдса IssuerKeyHash

При использовании пользовательского URL-адреса в поле "URL-адрес для загрузки" certutilполная цепочка сертификатов не генерируется и, следовательно, приводит к запросу OCSP без IssuerKeyHash,

Стандартные клиенты CryptoAPI никогда не отправляют запрос OCSP с пустым IssuerKeyHash и это просто своеобразно certutil поведение, которое может быть проигнорировано, так как оно также имеет тенденцию к сбою с серверами Windows OCSP (проверено на моем конце также с Microsoft CA)

Подробности для "certutil -url"

Только частичный ответ.

«CertUtil» — это общий инструмент Microsoft для сертификатов/PKI. Он может делать МНОГО вещей.

Теперь это URL Retrieval ToolGUI — это то, что происходит, когда вы запускаете его с параметром «-url».

Что я нахожу немного странным, так это то, что -URLпараметр НЕ является общедоступным документом.

  • Он не указан в документации Microsoft.com: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certutil .
  • Его даже нет в списке ss64: https://ss64.com/nt/certutil.html .
  • Он не указан в справке "CertUtil -v -? -- Показать весь текст справки для всех глаголов" . Есть только -URLCacheа также -urlfetchно нет -url:
            PS C:\> Get-Command certutil | select -expand fileversioninfo | fl filename, fileversion
    FileName    : C:\WINDOWS\system32\certutil.exe
    FileVersion : 10.0.19041.1 (WinBuild.160101.0800)
    
    PS C:\> certutil -v -? | select-string ' -url'
      -URLCache         -- Display or delete URL cache entries
      CertUtil [Options] -URLCache [URL | CRL | * [delete]]
      -urlfetch         -- Retrieve and verify AIA Certs and CDP CRLs
    

Но у него есть текст справки, если вы попросите его конкретно:

      C:\> certutil.exe -URL -?
Usage:
  CertUtil [Options] -URL InFile | URL
  Verify Certificate or CRL URLs

Options:
  -f                -- Force overwrite
  -Unicode          -- Write redirected output in Unicode
  -gmt              -- Display times as GMT
  -seconds          -- Display times with seconds and milliseconds
  -split            -- Split embedded ASN.1 elements, and save to files
  -v                -- Verbose operation
  -privatekey       -- Display password and private key data
  -pin PIN                  -- Smart Card PIN
  -sid WELL_KNOWN_SID_TYPE  -- Numeric SID
            22 -- Local System
            23 -- Local Service
            24 -- Network Service

CertUtil -?              -- Display a verb list (command list)
CertUtil -URL -?         -- Display help text for the "URL" verb
CertUtil -v -?           -- Display all help text for all verbs

Чтобы получить графический интерфейс «Инструмент поиска URL», вы можете просто запустить certutil следующим образом.

      C:\> certutil -url http://example.com

Другие вопросы по тегам