离线吊销模式

10

我的问题类似于这个问题。

我正在尝试仅使用本地CRL检查吊销列表。

我正在使用带有以下参数的X509Chain.Build():

    var chainMachine = new X509Chain(true);
            chainMachine.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain;
            chainMachine.ChainPolicy.UrlRetrievalTimeout = TimeSpan.FromSeconds(30);
            chainMachine.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;
            chainMachine.ChainPolicy.VerificationTime = DateTime.Now;
            chainMachine.ChainPolicy.RevocationMode = X509RevocationMode.Offline;

但是我收到了以下错误:

  1. RevocationStatusUnknown => 撤销功能无法检查证书的撤销状态。
  2. OfflineRevocation => 因为撤销服务器离线,撤销功能无法检查证书的撤销状态。

奇怪的是,一旦我尝试在线检查撤销列表(结果会更新CRL),问题就得到解决。因此看起来,一旦缓存中有任何东西,就不能再复现此问题。

我认为可能错误消息不正确,实际上当缓存为空时,会出现某些异常导致弹出此消息,或者可能存在某个标志,指示缓存是否有时已更新,如果从未更新,则尝试从外部服务器获取信息。

有人能指出这个问题的原因吗?


我也看到了同样的行为。它没有告诉我服务器已经离线,只是说无法检查吊销。这似乎不会发生在自签名证书上。 - Mark
1个回答

9

X509RevocationMode.None: 不检查CRLs或OCSP。

X509RevocationMode.Offline: 如果缓存了CRL并且仍然有效,则将其用于吊销。否则,如果证书应该进行吊销检查(取决于EntireChain/ExcludeRoot/EndCertificateOnly),则报告OfflineVerification|RevocationStatusUnknown。(如果OCSP响应的nextUpdate值建议这样做,则也可以缓存它们;但我不确定是否是这样)。

X509RevocationMode.Online: 如果在证书中描述了OCSP端点,则执行OCSP检查。如果OCSP没有得出确切的答案并且定义了CRL Distribution Point,则检查缓存以获取CRL。如果它有效,则将其用作吊销的基础;否则下载CRL并将其缓存。如果所有尝试查找吊销状态均失败,请设置RevocationStatusUnknown。

离线模式很棘手,因为CRL已过期。即使您只是一个小时前进行了在线请求,也不能保证现在离线工作正常。我能想到的最好用途是使快乐路径变快;如果您获得的任何错误除了RevocationStatusUnknown或OfflineRevocation之外,则认为链失败...但这两者中的任何一种都意味着再次使用Online模式询问。

(如http://referencesource.microsoft.com所述,Offline对应于CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY,该文档与https://msdn.microsoft.com/en-us/library/windows/desktop/aa376078(v=vs.85).aspx一样稀疏,但也许是“仅检查缓存”更具启示性)


关于在线模式,OCSP是否像CRL一样被缓存?我认为/希望会使用缓存的OCSP。 - Stealth Rabbi
@StealthRabbi 我想是这样的,如果它设置了nextUpdate字段;但是我对Crypt32的黑盒子和OCSP的观察较少。 - bartonjs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接