在我的程序中,我CertGetCertificateChain
用来调查证书的有效性。如果在我的测试 PKI 中我撤销证书并指定原因“未指定”,则最后一个参数中的错误代码pChainContext->TrustStatus.dwErrorStatus
为零,表示没有错误,证书不被视为已撤销。但是,在 Windows 事件日志中,我可以看到以下条目:
因此,撤销及其原因得到了正确检测,但CertGetCertificateChain
并没有让我知道。
如果我以任何其他原因(例如“停止操作”)撤销证书,则CertGetCertificateChain
正确返回pChainContext->TrustStatus.dwErrorStatus == 4
这意味着CERT_TRUST_IS_REVOKED
并且在 Windows 事件日志中我可以看到:
所以我的问题是:这种行为CertGetCertificateChain
正确吗?
我花了一些时间研究这个,我发现了这个文件。在第 6.3.2 (a) 节中,它说:
原因掩码:此变量包含到目前为止处理的 CRL 和增量 CRL 支持的撤销原因集。该集合的合法成员是可能的撤销原因值减去未指定的值:keyCompromise、cACompromise、affiliationChanged、superseded、cessationOfOperation、certificateHold、privilegeWithdrawn 和 aACompromise。特殊值 all-reasons 用于表示所有合法成员的集合。这个变量被初始化为空集。
(重点是我的)
另一方面,在下一段 6.3.2 (b) 中它说:
cert_status:此变量包含证书的状态。此变量可以分配以下值之一:unspecified、keyCompromise、cACompromise、affiliationChanged、superseded、cessationOfOperation、certificateHold、removeFromCRL、privilegeWithdrawn、aACompromise、特殊值 UNREVOKED 或特殊值 UNDETERMINED。此变量被初始化为特殊值 UNREVOKED。
我真的不知道如何解释这一点。这是否意味着所描述的算法不能因为未在掩码中设置而将“未指定”原因视为已撤销?如果是这样,这将意味着CertGetCertificateChain
行为正确。但随后出现了一些后续问题:难道不应该有一些大写的、闪烁的警告吗?
“如果您撤销证书,永远不要选择“未指定”作为原因,否则不会被视为撤销。”?
但也许我没有正确阅读这个,所以这里有一些我的其他盲目猜测为什么CertGetCertificateChain
不能像预期的那样工作:
- 也许我需要配置我的 CRL 以支持“未指定”的原因。但我看不到在哪里可以配置它。
- 我是否必须传递一些额外的标志才能
CertGetCertificateChain
使其考虑“未指定”的原因?我看不到任何听起来合适的标志... - 我是否试图解决一个不存在的问题?也许实际上没有人使用“未指定”的原因,这就是为什么我发现关于它的信息如此之少?
任何人都可以对此有所了解吗?