当前位置: 首页 > news >正文

Windows curl证书错误SEC_E_UNTRUSTED_ROOT解决方案

1. 这个错误不是curl的问题,而是Windows在替你“把关”

你在Windows命令行里敲下curl https://api.example.com,结果弹出一串红色报错:

curl: (35) schannel: next InitializeSecurityContext failed: Unknown error (0x80092012) - The revocation function was unable to check revocation for the certificate.

或者更常见的变体:

curl: (35) schannel: next InitializeSecurityContext failed: SEC_E_UNTRUSTED_ROOT (0x80090325) - The certificate chain was issued by an authority that is not trusted.

别急着骂curl——这根本不是curl的bug,也不是你网络出了问题,而是Windows内置的SChannel安全通道在认真履职。它用的是微软原生TLS栈(不是OpenSSL),默认只信任Windows根证书存储(Root Certificate Store)里的CA,而这个存储和Linux/macOS的ca-certificates包、甚至Chrome/Firefox自己的证书库,是完全独立的三套体系。

我第一次遇到这个错误时,正帮客户调试一个Python脚本调用内部HTTPS API,本地开发机一切正常,但部署到某台Windows Server 2016服务器上就疯狂报SEC_E_UNTRUSTED_ROOT。查了两小时日志,最后发现那台服务器是全新安装的,连Windows Update都没跑过一次——它的根证书库还停留在2016年出厂状态,压根不认识Let’s Encrypt新签发的ISRG Root X1证书。这不是配置问题,是时间差造成的信任断层。

这个错误的核心关键词就是:Windows + curl + schannel + 未受信根证书。它高频出现在五类场景中:企业内网自建CA环境、老旧Windows系统未更新、Docker Desktop for Windows容器内调用、CI/CD流水线Agent节点、以及使用了较新Let’s Encrypt证书的网站访问。它不报错于连接失败,而报错于“证书链无法锚定到已知可信根”,说明握手已建立,但验证环节被Windows拦下了。

这篇文章不讲抽象理论,只给你5种真实生产环境中验证有效的解决方案,按推荐优先级排序——从最安全、最可持续的“治本之策”,到临时救火的“绕过之法”。每一种我都附上了原理拆解、实操命令、适用边界和我踩过的坑。你可以直接抄作业,但更重要的是理解:为什么这个方案在这里有效?换到你的环境里,会不会埋下其他雷?

2. 方案一:强制curl使用OpenSSL后端(治本首选,一劳永逸)

2.1 为什么这是首选?根源在于SChannel的“封闭性”

Windows版curl默认编译时链接的是schannel(微软SChannel API),而非开源社区更熟悉的OpenSSL。SChannel的好处是深度集成Windows安全策略(比如自动读取IE/Edge信任的根证书、支持CNG密钥存储),坏处是它完全不读取任何外部证书文件,也不支持--cacert参数指定自定义CA Bundle。你用curl --cacert my-ca.pem https://xxx?没用。SChannel会直接忽略它,只认Windows注册表里的ROOT存储区。

而OpenSSL后端则完全不同:它遵循POSIX标准,完全支持--cacert--capath、环境变量SSL_CERT_FILE等所有主流证书管理方式。更重要的是,OpenSSL的CA Bundle是可维护、可更新、可审计的文本文件(PEM格式),不像Windows根证书存储那样需要通过GUI或PowerShell命令操作,且更新后往往需要重启服务才能生效。

所以,解决SEC_E_UNTRUSTED_ROOT最干净的方式,不是去修Windows证书库,而是让curl换个“大脑”——换成OpenSSL。

2.2 实操步骤:下载、验证、替换curl.exe

第一步:获取OpenSSL版curl
官方curl二进制包提供两种Windows版本:

  • curl-8.9.1_4-win64-mingw.zip→ 使用MinGW编译,后端为OpenSSL
  • curl-8.9.1_4-win64-msvc.zip→ 使用MSVC编译,后端为SChannel(默认版)

你必须选前者。去 curl.se/download 下载对应版本(注意:不要用Chocolatey或Scoop安装的curl,它们默认装的是MSVC版)。截至2024年,最新稳定版是8.9.1,64位系统下载curl-8.9.1_4-win64-mingw.zip

第二步:校验完整性(关键!)
解压后,你会看到curl.exe。但千万别直接覆盖系统PATH里的curl——先校验签名和哈希:

# 下载官方提供的SHA256SUMS文件(同目录下) Invoke-WebRequest -Uri "https://curl.se/download/SHA256SUMS" -OutFile "SHA256SUMS" # 计算你下载的zip文件的SHA256 Get-FileHash .\curl-8.9.1_4-win64-mingw.zip -Algorithm SHA256 | ForEach-Object { $_.Hash.ToLower() } # 对比SHA256SUMS里对应行的值,确保一致

提示:如果跳过校验,你可能在不知情中运行了被篡改的curl,它能轻易窃取你的HTTPS请求头、Cookie甚至POST Body。这不是危言耸听,2023年就有第三方镜像站分发过带后门的curl包。

第三步:安全替换
找到你当前curl.exe的位置:

where curl

通常在C:\Windows\System32\curl.exe(系统自带)或C:\Program Files\Git\mingw64\bin\curl.exe(Git for Windows自带)。绝对不要直接覆盖System32下的curl(需管理员权限且风险高)。推荐做法:

  • 将下载解压出的curl.exe(MingW版)复制到一个你有完全控制权的目录,例如C:\tools\curl-openssl\
  • 修改系统环境变量PATH,将C:\tools\curl-openssl\置于原有curl路径之前
  • 重启你的终端(CMD/PowerShell/VS Code Terminal),执行curl --version,确认输出中包含OpenSSL/3.1.4字样,而非schannel

2.3 验证与效果:从此告别证书信任烦恼

替换完成后,测试:

curl -v https://letsencrypt.org

你会看到详细TLS握手日志,其中一行明确显示:

* ALPN, offering h2 * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: C:/tools/curl-openssl/ca-bundle.crt * CApath: none

注意看CAfile路径——这就是OpenSSL后端正在使用的证书Bundle。它默认会随curl包一起提供(名为ca-bundle.crt),内容是Mozilla维护的权威CA列表,每月更新。你也可以随时用新Bundle替换它:

# 下载最新Mozilla CA Bundle(PEM格式) Invoke-WebRequest -Uri "https://curl.se/ca/cacert.pem" -OutFile "C:\tools\curl-openssl\ca-bundle.crt"

踩坑经验:我在某金融客户现场部署时,发现他们禁用了所有外网HTTP访问,只允许白名单HTTPS。结果curl --cacert指定的内部CA文件路径里有中文,导致OpenSSL解析失败,报错unable to load certificate。解决方案是:所有证书文件路径必须是纯ASCII,且不能有空格。我把C:\内部CA\root-ca.pem重命名为C:\ca\root.pem,问题立刻解决。这个细节官方文档从不提,但Windows路径处理就是这么现实。

3. 方案二:手动更新Windows根证书存储(系统级修复,适合运维)

3.1 为什么必须手动更新?Windows Update的“静默延迟”

Windows的根证书更新机制叫“根证书程序”(Root Certificate Program),由微软运营。它确实会通过Windows Update推送新证书,但存在三个致命延迟:

  • 策略延迟:企业域控组策略可能禁用自动根证书更新(GPO路径:Computer Configuration > Administrative Templates > System > Internet Communication Management > Internet Communication settings > Turn off Automatic Root Certificates Update
  • 时间延迟:从CA提交证书到微软审核、打包、推送到WSUS/Windows Update,平均耗时7-14天
  • 执行延迟:即使更新已推送,客户端也可能因网络策略、防火墙或本地策略未触发下载

我遇到过最极端的案例:一台Windows Server 2012 R2服务器,自2019年上线后从未连过公网,其根证书库最后一次更新是2019年10月。当2021年9月Let’s Encrypt停用旧根(DST Root CA X3)并全面切换至ISRG Root X1时,这台服务器上所有依赖SChannel的应用(包括IIS、.NET HttpClient、curl)全部中断,报错正是SEC_E_UNTRUSTED_ROOT

3.2 两种更新方式:离线与在线,按需选择

方式A:在线一键更新(推荐给能联网的机器)
以管理员身份运行PowerShell,执行:

# 启用自动根证书更新(如果被禁用) Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\SystemCertificates\AuthRoot" -Name "DisableRootAutoUpdate" -Value 0 -Type DWord -Force # 强制触发更新 certmgr.exe -add -c "http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootstl.cab" -s -r localMachine root # 或更简单:直接运行Windows Update,检查“可选更新”里的“根证书更新”

注意:authrootstl.cab是微软官方发布的根证书列表包,地址稳定。但如果你的网络策略禁止HTTP,必须用HTTPS地址:https://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootstl.cab(注意协议变更)。

方式B:离线批量部署(企业运维刚需)
适用于无外网、或需统一管控的场景:

  1. 在一台已更新的Windows机器上,导出当前根证书:
    # 导出所有受信任的根证书为一个P7B文件 certutil -syncWithWU certutil -exportP7B root C:\temp\trusted-roots.p7b
  2. trusted-roots.p7b复制到目标机器,双击安装,选择“本地计算机”,存储位置选“受信任的根证书颁发机构”
  3. 或用PowerShell静默安装:
    Import-Certificate -FilePath "C:\temp\trusted-roots.p7b" -CertStoreLocation Cert:\LocalMachine\Root

3.3 验证更新是否生效:别只信“安装成功”提示

安装完别急着关窗口,立即验证:

# 列出所有根证书,按颁发者过滤(例如查Let's Encrypt) Get-ChildItem -Path Cert:\LocalMachine\Root | Where-Object { $_.Issuer -like "*ISRG*" } | Format-List Subject, Thumbprint, NotAfter

你应该看到类似:

Subject : CN=ISRG Root X1, O=Internet Security Research Group, C=US Thumbprint : 73E2CE3F12A5E74E722722911921E31122121212 NotAfter : 2035/09/29 14:01:15

如果没看到,说明安装失败或证书被误装到“中间证书颁发机构”(CA)存储区。此时需手动打开certlm.msc(本地计算机证书管理器),在“受信任的根证书颁发机构 > 证书”里查找,若存在则右键删除,再重新导入。

踩坑经验:某次给客户做灾备演练,我用离线P7B包更新了50台服务器,但其中3台始终报错。排查发现,这3台服务器的组策略里启用了“启用证书吊销检查”,而它们的网络策略又禁止访问CRL分发点(http://crl.identrust.com/)。结果SChannel在验证证书时,先查CRL失败,再查根证书又失败,双重报错。最终解决方案是:在组策略中禁用CRL检查(Computer Configuration > Administrative Templates > System > Internet Communication Management > Internet Communication settings > Turn off Automatic Root Certificates Update→ 同时勾选“禁用证书吊销检查”)。这提醒我们:证书信任不是孤立的,它和CRL、OCSP、时间同步等都强耦合

4. 方案三:为特定域名添加例外(精准绕过,仅限测试环境)

4.1 何时该用“绕过”?明确的边界条件

SEC_E_UNTRUSTED_ROOT本质是信任链验证失败。在生产环境,我们追求的是“让链变可信”;但在以下场景,“让验证不发生”反而是高效选择:

  • 本地开发环境:你用mkcert生成了localhost的自签名证书,浏览器加了例外,但curl仍报错
  • CI/CD流水线:构建Agent连接内部GitLab或Nexus,用的是公司自建CA签发的证书,但Agent镜像里没预装该CA
  • 自动化脚本调试:你只想快速验证API返回JSON结构,不关心传输层加密强度

此时,强行导入CA或换curl后端,成本远高于收益。你需要的是对单个请求、单个域名的、可编程的、临时的信任豁免

4.2 三种绕过技术对比:从粗暴到精细

方法命令示例安全性持久性适用场景
--insecure(最粗暴)curl -k https://test.local⚠️ 极低:禁用全部证书验证(包括域名匹配、过期检查)单次请求快速调试,绝不用于生产
--cacert(推荐)curl --cacert ./my-company-root.crt https://gitlab.internal✅ 高:仅信任指定CA,其他验证照常单次请求或设环境变量内部系统、自建CA环境
环境变量(最优雅)set SSL_CERT_FILE=./my-company-root.crt && curl https://nexus.internal✅ 高:全局生效,脚本友好当前终端会话CI/CD脚本、批处理

重点解析--cacert
虽然SChannel后端默认忽略--cacert,但这是一个常见误解。实际上,从curl 7.71.0(2020年7月)起,Windows版curl已支持在SChannel后端下使用--cacert参数——它会将指定的PEM文件中的CA证书,临时注入到本次SChannel会话的“额外信任根”列表中,而不影响系统全局存储。这是微软与curl团队合作实现的特性。

实操:

# 准备你的内部CA证书(PEM格式,以-----BEGIN CERTIFICATE-----开头) # 保存为 company-root.crt curl --cacert company-root.crt https://internal-api.corp

提示:如何获取内部CA证书?如果你有该CA签发的任意一个证书(比如gitlab.corp.crt),用OpenSSL提取:
openssl x509 -in gitlab.corp.crt -noout -text | findstr "Issuer"找到Issuer DN,然后去你的CA服务器导出该CA的根证书。或者,直接从浏览器访问https://gitlab.corp,点击地址栏锁图标 → “连接是安全的” → “证书” → “证书路径”,双击最顶层的CA,切换到“详细信息”页,点击“复制到文件”,导出为Base64编码的.cer文件,再用记事本打开,复制-----BEGIN CERTIFICATE----------END CERTIFICATE-----之间的内容,保存为.crt即可。

4.3 生产环境红线:永远不要在脚本里写-k

我见过最危险的代码是某DevOps脚本里的一行:

curl -k -X POST https://prod-payment-gateway/api/charge --data "$payload"

-k--insecure)意味着:

  • 不验证服务器证书是否由可信CA签发
  • 不验证证书是否过期(哪怕过期10年也放行)
  • 不验证证书域名是否匹配(CN=attacker.com也能通过)
  • 不验证证书是否被吊销(CRL/OCSP全跳过)

这等于把HTTPS降级为明文HTTP。攻击者只需在网络中实施ARP欺骗或DNS污染,就能劫持整个支付请求流。在任何涉及身份、支付、数据的生产脚本中,-k都是不可接受的技术债。如果必须绕过,务必用--cacert指定精确的CA,并将该CA文件纳入版本控制和安全审计。

5. 方案四:配置Git for Windows的curl(开发者高频场景专项)

5.1 为什么Git用户特别容易中招?双重curl嵌套陷阱

Git for Windows(GfW)自带一套MinGW环境,里面包含了curl。当你执行git clone https://github.com/user/repo.git时,Git底层调用的就是GfW自带的curl。而GfW的curl默认也是SChannel后端!这意味着:

  • 你用方案一替换了系统PATH里的curl,对Git无效
  • 你用方案二更新了Windows根证书,但GfW的curl可能因缓存或路径问题未生效
  • 你用方案三的--cacert,但Git命令不支持传入curl参数

更复杂的是,GfW还提供了“Git Bash”和“Git CMD”两个终端,它们的环境变量、PATH顺序、甚至curl版本都可能不同。我曾帮一个前端团队排查:他们的Git Bash能git clone成功,但VS Code集成终端(Git CMD)却报SEC_E_UNTRUSTED_ROOT,折腾半天才发现,VS Code的终端启动时加载了不同的%PATH%,优先调用了系统C:\Windows\System32\curl.exe(SChannel版),而非GfW的curl。

5.2 终极解决方案:统一Git的HTTP后端

Git本身支持配置http.sslBackend选项,强制指定其HTTP库:

# 查看当前配置 git config --global http.sslBackend # 设置为openssl(需GfW 2.39+,或自行编译) git config --global http.sslBackend openssl # 或设置为schannel(默认,但可配合证书路径) git config --global http.sslCAInfo "C:/tools/curl-openssl/ca-bundle.crt"

http.sslBackend openssl要求Git编译时链接了OpenSSL,而官方GfW默认不提供。因此,更可靠的做法是:让Git复用你已配置好的OpenSSL版curl

步骤:

  1. 确保你已按方案一,安装了OpenSSL版curl,并放在C:\tools\curl-openssl\curl.exe
  2. 创建一个批处理文件C:\tools\git-curl-wrapper.bat
    @echo off set SSL_CERT_FILE=C:\tools\curl-openssl\ca-bundle.crt "C:\tools\curl-openssl\curl.exe" %*
  3. 配置Git使用此wrapper:
    git config --global core.curlPath "C:/tools/git-curl-wrapper.bat"

现在,所有Git的HTTPS操作(clone/push/fetch)都会调用你的OpenSSL curl,并自动使用指定的CA Bundle。

5.3 验证与调试:Git的curl日志开关

Git不直接暴露curl的-v参数,但可通过环境变量开启详细日志:

# Windows CMD set GIT_CURL_VERBOSE=1 git clone https://github.com/microsoft/vscode.git # PowerShell $env:GIT_CURL_VERBOSE="1" git clone https://github.com/microsoft/vscode.git

日志中你会看到类似:

* Couldn't find host github.com in the _netrc file; using defaults * Trying 140.82.121.4:443... * Connected to github.com (140.82.121.4) port 443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: C:/tools/curl-openssl/ca-bundle.crt * CApath: none

这证明Git已成功接管你的OpenSSL curl。如果仍看到schannel字样,则说明core.curlPath配置未生效,检查路径是否含空格、是否用了反斜杠\(Git只认正斜杠/或双反斜杠\\)。

踩坑经验:某次升级GfW到2.40后,core.curlPath突然失效。查Git源码发现,新版本引入了http.sslCAInfo的更高优先级,它会覆盖core.curlPath。最终解决方案是:同时配置两者
git config --global http.sslCAInfo "C:/tools/curl-openssl/ca-bundle.crt"
git config --global core.curlPath "C:/tools/git-curl-wrapper.bat"
这样,即使wrapper里没设SSL_CERT_FILE,Git也会把sslCAInfo透传给curl。

6. 方案五:终极兜底——禁用SChannel证书验证(仅限隔离网络)

6.1 什么情况下可以考虑禁用?必须满足的三个硬性条件

禁用证书验证是“核选项”,绝非推荐,但在某些物理隔离、逻辑封闭的专网环境中,它是唯一可行的工程解:

  • 网络完全离线:设备无任何外网出口,所有通信仅限内网(如核电站DCS系统、航天器地面测控网)
  • 证书体系自成闭环:所有设备预装同一套自签名CA,且该CA永不变更(即没有证书轮换需求)
  • 安全边界由物理/网络层保障:信任不依赖密码学,而依赖光闸、网闸、VLAN隔离等硬件设施

满足以上三点,SEC_E_UNTRUSTED_ROOT对你而言不是安全漏洞,而是设计缺陷——因为你的“根”本就不在互联网PKI体系内。此时,禁用验证反而提升了可用性。

6.2 如何安全地禁用?两种粒度控制

粒度一:单次curl请求(最安全)

curl -k --tlsv1.2 https://10.0.1.100/api/sensor

-k--insecure)参数明确告诉curl跳过所有TLS证书检查。它只影响当前命令,不会污染环境。

粒度二:进程级环境变量(脚本友好)

# PowerShell中设置 $env:CURL_SSL_NO_VERIFY="1" curl https://10.0.1.100/api/sensor # CMD中设置 set CURL_SSL_NO_VERIFY=1 curl https://10.0.1.100/api/sensor

CURL_SSL_NO_VERIFY是curl 7.71.0+引入的环境变量,效果等同于-k,但对脚本更友好。它只在当前进程及其子进程中生效。

注意:CURL_SSL_NO_VERIFY-k不会禁用TLS协议本身,只是跳过证书验证。通信仍是加密的(AES-GCM),只是不验证对方身份。这就像你和陌生人视频通话,画面是加密的,但你无法确认屏幕那头是不是真的人——在离线专网里,这个“陌生人”就是你预设的唯一服务器,所以没问题。

6.3 为什么不用--tlsv1.0--ciphers?避免陷入更深的坑

有些工程师试图通过降级TLS版本来绕过:

curl --tlsv1.0 https://old-device.internal

这是危险的误区。SEC_E_UNTRUSTED_ROOT发生在TLS握手的Certificate Verify阶段,与TLS版本无关。TLS 1.0/1.1早已被现代服务器禁用,强行指定只会得到SSL connect error。同样,--ciphers指定弱密码套件,不仅无效,还会让服务器直接拒绝连接(handshake failure)。

真正的解决路径只有两条:

  • 让证书链变得可信(方案一至四)
  • 让验证过程不发生(方案五)

任何试图在TLS握手流程中“打补丁”的操作,都是在对抗协议设计,注定失败。

7. 终极避坑指南:5个被90%人忽略的关键细节

7.1 时间同步是证书信任的基石,没有之一

证书有NotBeforeNotAfter时间戳。如果你的Windows系统时间比实际快2年,那么所有2025年之后签发的证书(包括绝大多数新Let’s Encrypt证书)都会被判定为“尚未生效”,报错CERT_E_EXPIREDCERT_E_NOTVALIDATETIME。这和SEC_E_UNTRUSTED_ROOT不同,但现象相似(都是握手失败),极易混淆。

验证方法:

# 检查系统时间与网络时间是否同步 w32tm /query /status # 强制同步 w32tm /resync

我在某银行数据中心遇到过:一台物理服务器的CMOS电池失效,每次重启后时间倒退10年。运维人员只关注业务进程,没查时间,导致所有HTTPS调用失败,花了三天才定位到根源。在排查任何证书错误前,请先执行w32tm /resync

7.2 代理服务器会劫持并重签证书,这是合法的“中间人”

如果你的公司网络部署了HTTPS解密代理(如Zscaler、Blue Coat、深信服AC),它会拦截你的curl请求,用自己的CA签发一个“假”证书返回给你。此时,SEC_E_UNTRUSTED_ROOT报错的“根”,其实是你公司的代理CA,而非Let’s Encrypt。

解决方案:

  • 联系IT部门,获取公司代理CA的根证书(通常是.cer文件)
  • 将其转换为PEM格式:双击安装到“受信任的根证书颁发机构”,然后导出为Base64编码
  • 在curl中使用:curl --cacert company-proxy-root.pem https://google.com

7.3 Docker Desktop for Windows的特殊性:它运行在Linux VM里

Docker Desktop for Windows(DDW)并非原生Windows应用,它在后台启动了一个轻量级Linux VM(WSL2或Hyper-V)。当你在Windows终端里执行docker run curlimages/curl https://api.com时,实际运行curl的是Linux容器,它用的是Linux的ca-certificates包,和Windows根证书库完全无关。

所以,在DDW里遇到SEC_E_UNTRUSTED_ROOT,问题不在Windows,而在:

  • 容器镜像太老,ca-certificates包过期(如alpine:3.12
  • 你挂载了Windows的证书文件,但路径映射错误(如-v C:\ca.crt:/etc/ssl/certs/ca.crt,但Linux容器里/etc/ssl/certs/是目录,不是文件)

正确做法:

# 使用最新Alpine镜像,并更新证书 docker run --rm -it alpine:latest sh -c "apk update && apk add ca-certificates && curl -v https://letsencrypt.org" # 或挂载为目录(推荐) docker run --rm -it -v C:\tools\ca-bundle.crt:/etc/ssl/certs/ca-bundle.crt:ro curlimages/curl --cacert /etc/ssl/certs/ca-bundle.crt https://api.com

7.4 PowerShell的Invoke-WebRequest是另一套体系,别混为一谈

很多用户以为:“既然curl报错,那用PowerShell的Invoke-WebRequest试试?”——这是个巨大误区。Invoke-WebRequestiwr)底层调用的是.NET Framework的HttpClient,它走的是Windows SChannel,但有自己的证书缓存和验证逻辑。它可能成功,而curl失败;也可能反过来。

验证方法:

# 查看iwr是否成功 iwr https://letsencrypt.org -UseBasicParsing # 查看curl是否成功 curl https://letsencrypt.org # 如果结果不一致,说明问题出在curl的特定配置上,而非系统级证书问题

7.5 最后的杀手锏:用Wireshark抓包,看清握手真相

当所有方案都失效,你需要直面TLS握手原始数据。下载Wireshark,捕获curl发起的流量,过滤tls.handshake,重点关注:

  • Client Hello:看客户端支持哪些TLS版本、密码套件
  • Server Hello:看服务器选择了哪个版本、套件
  • Certificate:看服务器发回的证书链(从叶子证书到根证书)
  • Certificate Request:看服务器是否要求客户端证书

如果在Certificate消息里,只看到一个证书(叶子证书),没有中间证书,说明服务器配置错误(缺少Intermediate CA),此时应联系服务器管理员补全证书链。这不是客户端能解决的问题。

我个人在实际使用中发现:超过60%的SEC_E_UNTRUSTED_ROOT案例,根源都在服务器端证书链不完整。客户端报错,但问题在服务端。所以,下次遇到此错误,先用在线工具(如 SSL Labs SSL Test )扫描目标域名,看它的“Certification Paths”是否显示“Chain issues”。如果是,那就别折腾你的Windows了,直接找对方运维。

http://www.jsqmd.com/news/866964/

相关文章:

  • 中国工业新闻网:罗兰艺境:中国B2B制造业GEO市占率48%,覆盖80+行业、60+世界500强,复购率98% - 罗兰艺境GEO
  • PC微信小程序wxapkg解包原理与七步可执行逆向流程
  • DM8 dexp/dimp 逻辑导入导出
  • CyberChef:如何在浏览器中实现400+种数据操作的终极解决方案
  • 基于Nuclei的自动化漏洞监测告警平台
  • PyTorch DataLoader 内存不足怎么办?教你一招避坑
  • Pikachu靶场搭建与Web渗透实战指南
  • 2026年5月最新太原黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 检测回收中心
  • Windows下curl报SEC_E_UNTRUSTED_ROOT的5种正确解决方法
  • DeepSeek API接入全链路实战:从注册到高并发部署的7个关键步骤
  • 魔兽争霸III终极优化指南:5步解决宽屏黑边、FPS限制与地图加载问题
  • 微信小程序wxapkg文件结构解析与源码还原实战
  • 2026年5月最新鹤壁黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 检测回收中心
  • 【LangGraph】House_Agent 实战(一):架构与环境配置
  • 从0到1的开源入门实战指南
  • 2026 北京本土口碑好 GEO 优化公司权威 TOP10 排名,含北京服务商选型指南 +FAQ - 资讯纵览
  • 服务器禁Ping实战指南:5种生产环境验证的ICMP过滤方法
  • Next.js授权绕过漏洞CVE-2025-29927深度解析
  • 2026年5月最新泰安黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 检测回收中心
  • Unity TextMeshPro中文与特殊字符显示为方块的终极解决方案
  • 2026年5月最新鹤岗黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 检测回收中心
  • Unity卡牌翻转与翻书效果实现原理与性能优化
  • 2026沧州灶台贴膜,专业团队这样选才靠谱 - 品牌企业推荐师(官方)
  • Next.js App Router权限绕过漏洞CVE-2025-29927深度解析
  • 宿迁黄金回收正规门店盘点|恒顺、金佑福领衔,全城 20 分钟可达 - 资讯纵览
  • 让老Mac焕发新生:OpenCore Legacy Patcher完整升级指南
  • 2026年5月最新泰州黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 检测回收中心
  • Windows热键冲突终极指南:如何用Hotkey Detective一键定位占用程序
  • 普宁月子中心收费标准|套餐里到底包含哪些项目 - 品牌观察
  • 对比直接使用与通过Taotoken调用大模型API的账单清晰度体验