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 Tool
GUI — это то, что происходит, когда вы запускаете его с параметром «-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