项目场景:
最近在使用Windows Crypto API 做验签,遇到的一些问题.
问题描述
在调用Windows Crypto API时 发现有网络请求(microsoft/DigiCert等网站)的流量
原因分析:
CertGetCertificateChain->CRYPT32!CChainPathObject::CChainPathObject()这个函数内会进行区分
问题结论
调用Windows Crypto API时存在自动更新根证书 自动访问特定网站下载证书行为.
解决方案:
CertGetCertificateChain function (wincrypt.h)
dwFlag解释
Value | Meaning |
CERT_CHAIN_CACHE_END_CERT 0x00000001 | 当这个标志设置,最终证书缓存,这可能会加快正在建设的过程。 默认情况下,最终的证书是不缓存,它需要验证每次链构建。 |
CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY 0x80000000 | 吊销证书检查只访问缓存的url。 |
CERT_CHAIN_REVOCATION_CHECK_OCSP_CERT 0x04000000 | 这个标志内部使用在链构建一个在线证书状态协议(OCSP)签名者证书,以防止循环吊销证书检查。链建设期间,如果签署的OCSP反应是一个独立的OCSP签名者,然后,除了原来的链构建,还有第二个链构建OCSP签名者证书本身。这个标志这第二个链构建期间用于抑制递归独立OCSP签名者证书。如果签名者证书包含szOID_PKIX_OCSP_NOCHECK扩展,叶签名者证书吊销证书检查被跳过。OCSP和CRL检查都是允许的。 Windows Server 2003和Windows XP:不支持这个值。 |
CERT_CHAIN_CACHE_ONLY_URL_RETRIEVAL 0x00000004 | 只使用缓存的url在构建一个证书链,不会在互联网和内联网搜寻基于URL的对象 注意:这个标志不适用吊销证书检查。缓存设置CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY只使用url吊销证书检查。 |
CERT_CHAIN_DISABLE_PASS1_QUALITY_FILTERING 0x00000040 | |
CERT_CHAIN_DISABLE_MY_PEER_TRUST 0x00000800 | 不支持这个标志。证书在“MY”证书存储从不考虑同伴的信任。 |
CERT_CHAIN_ENABLE_PEER_TRUST 0x00000400 | 在“TrustedPeople”证书存储的终端实体证书没有执行任何链构建都是可信任的。这个函数不设置CERT_TRUST_IS_PARTIAL_CHAIN或CERT_TRUST_IS_UNTRUSTED_ROOT dwErrorStatus ppChainContext参数的成员。 Windows Server 2003 Windows XP:不支持这个标志。 |
CERT_CHAIN_OPT_IN_WEAK_SIGNATURE 0x00010000 | 设置此标志显示调用者希望选择弱签名检查。 这个标志可以在每个操作系统的汇总更新从Windows 7和Windows Server 2008 R2 开始 |
CERT_CHAIN_RETURN_LOWER_QUALITY_CONTEXTS 0x00000080 | 默认是只返回最高质量链的道路。设置此标志将返回低质量链。这些返回的cLowerQualityChainContext和rgpLowerQualityChainContext字段链上下文。 |
CERT_CHAIN_DISABLE_AUTH_ROOT_AUTO_UPDATE 0x00000100 | 设置这个标志阻止第三方根证书的从Windows更新Web服务器的自动更新 |
CERT_CHAIN_REVOCATION_ACCUMULATIVE_TIMEOUT 0x08000000 | |
CERT_CHAIN_TIMESTAMP_TIME 0x00000200 | 这个标志被设置时,pTime作为时间戳时间确定最终的证书是有效的。当前时间也可以用来确定最终证书仍然有效。所有其他认证机构(CA)和根证书链中使用当前时间而不是pTime检查。 |
CERT_CHAIN_DISABLE_AIA 0x00002000 | 设置这个标记显式地关闭 Authority Information Access (AIA)检索。 |
您还可以设置以下吊销标志,但只有一个标志从这组可以设置一次:
Value | Meaning |
CERT_CHAIN_REVOCATION_CHECK_END_CERT 0x10000000 | 吊销证书的检查在最终证书,也仅仅是对最终证书 |
CERT_CHAIN_REVOCATION_CHECK_CHAIN 0x20000000 | 吊销证书的检查在所有证书,且在每一个链。 |
CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT 0x40000000 | 吊销证书的检查在所有的所有证书链上进行,除了根证书。 |
END_CERT:终端实体证书/叶证书/SSL证书
解决方案
主要是在函数的dwFlag上处理
总结
参考: