一些用户报告说,Desura(我开发的程序)将无法启动,原因是该服务在尝试验证代码签名证书时返回了错误代码CERT_E_CHAINING。
Msdn将此报告为:未正确创建证书链。
我似乎无法弄清楚是什么原因或此错误的含义。有任何想法吗?
最佳答案
在MSDN上的WinVerifyTrust文档中,您可以阅读
问题是,如果需要验证是否允许使用一个证书进行代码签名,则应该完成许多工作。首先,证书本身必须有效,并且必须具有szOID_PKIX_KP_CODE_SIGNING
(“1.3.6.1.5.5.7.3.3”)。此外,其父级和父级的父级应该没问题。例如,如果父级在增强型密钥用法中只有szOID_PKIX_KP_CLIENT_AUTH
(“1.3.6.1.5.5.7.3.2”),或者如果父级证书中的一个被重新定位,则您尝试验证的证书将无效。因此,必须建立链并必须验证链。
可以进行许多有趣的替换。例如,父证书中的一个证书可能现在已过期。另一方面,证书通常不仅会签名,而且还会使用Time Stamping。因此,可以验证作为颁发者的根证书现在已过期,但是根证书在颁发子证书时仍然有效。如果通过相应的时间签名证明了子证书的签名时间,并且颁发的证书尚未过期,则子证书将有效。我希望这个例子不要太复杂。我只想表明,不仅应该验证链中的每个证书,还应该验证整个链。抱歉,这么长时间的解释。
我想,WinVerifyTrust
在内部以某种方式使用了CertGetCertificateChain
和CertVerifyCertificateChainPolicy
函数,但是不清楚使用哪个参数。许多事情取决于您使用的WINTRUST_DATA
的参数。
无论如何,错误CERT_E_CHAINING
可能来自CertGetCertificateChain
,CertVerifyCertificateChainPolicy
或内部使用的任何其他API。例如,它可以来自CERT_CHAIN_POLICY_STATUS的dwError
字段,用作pPolicyStatus
的CertVerifyCertificateChainPolicy
参数。
您写了“某些用户正在报告”错误,因此可能是用户尝试以错误的方式使用您的应用程序,或者某些证书安装不正确。例如,如果一张导出证书可以与没有 parent 的 parent 证书一起做。如果一份导出证书没有 parent ,则对进口证书的确认会更加复杂。在某些情况下,可以根据子证书中的URL下载根证书,但在其他情况下,则是不可能的。如果找不到或下载父证书或父证书,则将出现CERT_E_CHAINING
错误。
关于c++ - WinVerifyTrust返回CERT_E_CHAINING,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8160240/