WinHTTP/ServerXMLHTTP请求报错:证书链由不受信任颁发机构颁发
问题核心原因
报错80090325(证书链由不受信任的颁发机构签发)的核心诱因有3个,也是你当前配置不生效的直接原因:
- 你使用的忽略证书错误的参数值错误,且配置位置不对:网上流传的
setOption 2, 13056仅覆盖了证书CN不匹配、证书用途不匹配两类错误,没有包含忽略不受信任根CA的标记位,根本无法绕过当前的根信任校验错误;且该配置必须放在Open调用之后、Send调用之前才会生效,放在其他位置会直接被组件忽略。 - WinHttp组件的证书信任逻辑和浏览器、SoapUI不一致:浏览器、SoapUI(Java实现)会自动通过证书的AIA扩展下载缺失的中间CA证书,也会自动读取系统全局的证书存储,但WinHttp既不会自动拉取缺失的中间证书,默认也仅读取当前脚本运行上下文所属用户的证书存储,而非本地计算机全局存储;你测试的不同版本ServerXMLHTTP组件底层同样依赖WinHttp的证书校验逻辑,所以会出现完全一致的报错。
- 32/64位证书存储隔离:如果你用32位脚本宿主(32位wscript/cscript、32位应用调用组件)运行代码,会独立读取32位系统的证书存储,你在64位证书管理器里导入的证书不会被32位组件识别。
解决方案
临时调试方案(仅用于定位问题,生产环境禁止使用)
先修正忽略证书校验的配置,验证问题是否确实出在证书链环节:
Set httpRequest = CreateObject("WinHttp.WinHttpRequest.5.1") httpRequest.Open "POST", "<WSDL Endpoint Here>", False ' 61440 = 4096(忽略用途错误) + 8192(忽略CN不匹配) + 16384(忽略过期) + 32768(忽略不受信根),覆盖所有SSL证书错误 httpRequest.Option(2) = 61440 httpRequest.Send payload
如果调整后请求能正常返回,说明问题确实出在证书链校验环节,可继续走下面的永久修复方案。
永久修复方案(生产环境推荐)
- 补全证书链配置
- 手动将中间CA证书
Company Issuing CA 1导入到「本地计算机账户 -> 中间证书颁发机构」存储,避免TLS握手时链断裂;同时联系服务端运维确认,TLS握手响应中会完整返回站点证书+中间CA证书的完整链,不要依赖客户端拉取中间证书。
- 手动将中间CA证书
- 将根证书导入到正确的信任存储
- 如果你是手动双击运行脚本,将根证书
Company Root CA 1导入到当前登录用户的「受信任的根证书颁发机构」存储,而非仅导入本地计算机存储。 - 如果脚本运行在系统服务、计划任务、IIS应用池等系统账户上下文下,用管理员身份执行命令将根证书导入系统级信任存储:
certutil -addstore -f Root "C:\path\to\Company Root CA 1.cer"
- 如果你是手动双击运行脚本,将根证书
- 兼容32位运行环境
如果你使用32位脚本宿主运行代码,需要额外执行32位版本的certutil导入证书:C:\Windows\SysWOW64\certutil.exe -addstore -f Root "C:\path\to\Company Root CA 1.cer" C:\Windows\SysWOW64\certutil.exe -addstore -f CA "C:\path\to\Company Issuing CA 1.cer"
问题排查辅助
如果以上配置完成后仍报错,可以开启WinHttp详细日志定位具体失败环节:
:: 开启追踪 netsh winhttp set tracing trace-file=C:\winhttp.log level=verbose format=ansi state=enabled :: 复现问题后关闭追踪 netsh winhttp set tracing state=off
查看生成的C:\winhttp.log即可看到证书链校验的具体失败节点。
内容的提问来源于stack exchange,提问作者A. Rahm
相关产品推荐
相关产品推荐

