[总结]Windows Crypto API 自动更新根证书问题原因及解决方案

项目场景:

最近在使用Windows Crypto API 做验签,遇到的一些问题.


问题描述

在调用Windows Crypto API时 发现有网络请求(microsoft/DigiCert等网站)的流量


原因分析:

CertGetCertificateChain->CRYPT32!CChainPathObject::CChainPathObject()这个函数内会进行区分


问题结论

调用Windows Crypto API时存在自动更新根证书 自动访问特定网站下载证书行为.


解决方案:

CertGetCertificateChain function (wincrypt.h)

官网解释
dwFlag解释

ValueMeaning
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)检索。

您还可以设置以下吊销标志,但只有一个标志从这组可以设置一次:

ValueMeaning
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上处理

总结

参考:
不支持ISRG?在Windows 10/8.1/7中更新根证书列表
Windows下验证https证书
CryptoAPI System Architecture

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二进制怪兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值