Windows Microsoft OCSP检查(OCSP与轻型OCSP);混淆的回答是;certutil-url"; 常规OCSP(RFC 6960)

Windows Microsoft OCSP检查(OCSP与轻型OCSP);混淆的回答是;certutil-url"; 常规OCSP(RFC 6960),windows,ocsp,certutil,Windows,Ocsp,Certutil,我已经编写了一个OCSP响应程序,其中响应基于以下声明: 如果未设置nextUpdate,则响应程序将指示更新的 撤销信息随时可用 因此,我没有设置nextUpdate,只是像这里一样使用了BouncyCastleBasicOCSPRespBuilder(它默认设置此更新,如Wireshark捕获中所示): 但是这些响应被IIS中的证书身份验证程序拒绝。尝试certutil时,响应状态始终为“过期” 这是使用“certutil-url”命令验证的 轻型OCSP(RFC 5019) 谷歌搜索显示

我已经编写了一个OCSP响应程序,其中响应基于以下声明:

如果未设置nextUpdate,则响应程序将指示更新的 撤销信息随时可用

因此,我没有设置nextUpdate,只是像这里一样使用了BouncyCastle
BasicOCSPRespBuilder
(它默认设置此更新,如Wireshark捕获中所示):

但是这些响应被IIS中的证书身份验证程序拒绝。尝试certutil时,响应状态始终为“过期”

这是使用“certutil-url”命令验证的

轻型OCSP(RFC 5019) 谷歌搜索显示,微软支持轻量级OCSP,如下所述:

客户端必须检查nextUpdate字段是否存在,并且必须 确保当前时间,以GMT时间表示,如中所述 第2.2.4节介于本次更新和下一次更新之间。如果 缺少nextUpdate字段,客户端必须拒绝响应

因此,我修改了实现,以包括nextUpdate日期(未来几分钟),如下所示:

basicOCSPRespBuilder.addResponse(certID, responseList.get(certID), getNextUpdateDate(), null);
这使我摆脱了“过期”状态问题,但现在的问题是,当它部署到Web服务器时,我尝试执行“certutil-url”检查,它会在证书中为WebProxy链接返回“Verified”,但如果我直接提供服务器的url,它会显示“OK”。在这两种情况下,响应结构保持不变,因为它是相同的响应者(使用Wireshark捕获进行验证,如果您愿意,我也可以附加此内容)

issuerKeyHash字段 这里有趣的事实是,通过WebProxy和直接URL发送到服务器的OCSP请求是不同的。不同之处在于OCSP请求在向直接链路发送请求时不包括
issuerKeyHash

Wireshark捕获发送到Webproxy的OCSP请求,该请求返回“已验证”:-

Wireshark捕获发送到返回状态“OK”的direct link的OCSP请求:-

问题是,请求如何在一个实例中包含issuerKeyHash,而在另一个实例中不包含issuerKeyHash。此外,为什么即使来自服务器的OCSP响应相似(由Wireshark Caputres确认),两个查询的状态也不相同

我也将非常感谢任何关于“URL检索工具”或“certutil-verify”的有见地的文档/链接

我还可以根据要求提供Wireshark捕获

我没有将Java和Bouncycastle作为标记,因为OCSP响应被Java、openssl等接受,没有任何问题(根据RFC 6960,有无nextUpdate)。这个问题是为了了解Microsoft certutil的情况&这里的OCSP检查

更新#1 ---开始更新#1---

正如@Crypt32所建议的那样;我可以验证,在URL字段中使用URL时,由于未知的原因,没有构建完整的证书路径,因此缺少
IssuerKeyHash

假设响应始终包含
IssuerKeyHash
,这可能导致“OK”而不是“Verified”状态。为了确认这一点,我修改了响应以匹配请求,并且如果请求中没有传递,但状态仍然为“OK”,并且没有更改为“Verified”,则不会发送
IssuerKeyHash

我们的想法是正确理解Microsoft应用程序如何处理OCSP响应,以及如何正确实现响应程序,从而使Microsoft应用程序不会一败涂地

正在进行研究,请提供任何建议和建议

---结束更新#1---

Re。下一个日期 Microsoft使用轻量级OCSP,因此需要一个
thisUpdate
nextUpdate
,如中所述

重新。certutil 由于@Crypt32,关于
certutil
的查询现已澄清

重新。IssuerKeyHash 在
certutil
的“下载URL”框中使用自定义URL时,不会生成完整的证书链,因此会导致没有
IssuerKeyHash
的OCSP请求

标准CryptoAPI客户端从不发送带有空
IssuerKeyHash
的OCSP请求,这只是一种特殊的
certutil
行为,可能会被忽略,因为它在Windows OCSP服务器上也会失败(在我这一阶段也通过Microsoft CA验证)

有关“certutil-url”的详细信息 只有部分答案

“CertUtil”是一个通用的Microsoft证书/PKI工具。它可以做很多事情

现在,当您使用“-URL”参数启动它时,就会出现这个
URL检索工具
GUI

我发现有点奇怪的是,
-URL
参数没有公开文档

  • 未在Microsoft.com文档中列出:
  • 它甚至没有在ss64上列出:
  • “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检索工具”GUI,您可以像这样启动certutil

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

据我所知,当您在证书中使用OCSP URL时(URL文本框为空,且radiobutton位于OCSP上),certutil执行证书链构建,并可以获取颁发者证书和获取
issuerKeyHash
。当您在certutil中提供显式URL时,它不会构建证书路径,因此
issuerKeyHash
为空<代码>已验证
状态表示工具获得了有效的OCSP响应,并且证书状态为
良好
<代码>正常
状态表示OCSP以
C:\> certutil -url http://example.com