我的问题类似于this问题。
我正在尝试仅使用本地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;
但我收到以下错误:
- RevocationStatusUnknown =>撤销功能无法检查证书的撤销。
- OfflineRevocation =>撤销功能无法检查证书的吊销,因为吊销服务器是 脱机。
醇>
奇怪的是,一旦我尝试在线检查撤销列表(因此CRL将会更新),问题就解决了。所以它看起来一旦缓存中有任何东西,就不能再复制这个问题了。
我认为错误消息可能不正确,实际发生的情况是当缓存为空时会出现一些异常导致此消息弹出。 另一种选择是,可能有一些标志说明缓存是否已经更新,如果它从未更新过,它会尝试从外部服务器获取信息
任何人都可以指出这个问题的原因是什么?
答案 0 :(得分:3)
X509RevocationMode.None :不检查CRL或OCSP。
X509RevocationMode.Offline :如果CRL已缓存且仍然有效,请将其用于吊销。否则,如果证书应该已经检查了吊销(取决于EntireChain / ExcludeRoot / EndCertificateOnly),请报告OfflineVerification | RevocationStatusUnknown。 (如果他们的nextUpdate值建议,也可以缓存OCSP响应;但我不确定它是否存在)。
X509RevocationMode.Online :如果证书中描述了OCSP端点,请执行OCSP检查。如果OCSP未产生确定答案且定义了CRL分发点,请检查CRL的缓存。如果有效,则将其作为撤销的依据;否则下载CRL并缓存它。如果查找撤销状态的所有尝试都失败,请设置RevocationStatusUnknown。
由于CRL过期,离线模式很棘手。即使您刚刚在一小时前发布了在线请求,但这并不意味着Offline现在可以正常运行。我能想到的最好的用途是快速开辟快乐的道路;如果你得到RevocationStatusUnknown或OfflineRevocation以外的任何错误,那么考虑链失败......但是其中任何一种都意味着再次使用在线模式。
(可以通过http://referencesource.microsoft.com确定,离线对应于CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY,这在https://msdn.microsoft.com/en-us/library/windows/desktop/aa376078(v=vs.85).aspx上几乎没有记录,但也许“仅限检查缓存”部分更具启发性)