尧图精选

Windows curl 报 0x80092013:证书吊销检查失败排查

🕒 发布时间:2026/10/1 7:13:44 📁 来源:尧图网络
上周三下午同事在 Windows 机器上跑一条一键安装命令脚本第一行就是curl -fsSL https://ollama.com/install.sh | sh那种经典写法。前一行还正常打印进度后一行直接甩出一段中文报错curl: (35) schannel: next InitializeSecurityContext failed: CRYPT_E_REVOCATION_OFFLINE (0x80092013) - 由于吊销服务器已脱机吊销功能无法检查吊销。命令退出码非 0后面的| sh拿到空输入脚本静默结束看起来像什么都没发生实际是整个 TLS 握手被系统安全组件掐断了。这个报错的迷惑性在于它长得不像网络错误也不像证书过期很多人第一反应是网络不通或者网站证书有问题然后开始加-k把安全校验整个关掉问题表面解决隐患留在那里。它真正的身份是 Windows 上 schannel系统自带的 TLS 实现在执行证书吊销检查时联系不上证书里标注的 CRL 或 OCSP 服务器于是拒绝继续握手。这篇文章会把这条报错从是谁在喊疼讲到四种解法各自的代价再到 PowerShell 抓证书验证、_curlrc全局配置、脚本里优雅兜底这些能直接抄作业的细节适合每天跟命令行打交道、又被这行中文报错卡住过的人。1. 先搞清楚这行报错到底是谁在喊疼1.1 中文报错只是壳0x80092013 才是坐标很多人搜由于吊销服务器已脱机搜不到有效信息是因为这串中文是 Windows 系统错误码的本地化翻译只在你系统语言是中文时才会出现。换台英文系统的机器同样的故障会显示成The revocation function was unable to check revocation because the revocation server was offline再换台日文系统又是一套说法。真正跨平台稳定的坐标是十六进制错误码0x80092013和符号名CRYPT_E_REVOCATION_OFFLINE这两个东西在任何语言版本里都不变。所以排查时的第一件事不是去搜中文原句而是把0x80092013或者CRYPT_E_REVOCATION_OFFLINE丢进搜索框。我个人的习惯是把错误信息里的三样东西记下来curl 错误码这里是 35、schannel 函数名InitializeSecurityContext、系统错误码0x80092013。有这三样基本能直接定位到问题层级——它发生在 TLS 握手的证书验证阶段而不是 DNS 解析或者 TCP 连接阶段。顺带说一个排查习惯curl 的错误码和括号里的描述是分层的curl: (35)是 curl 自己给的外层编号后面那串schannel: next InitializeSecurityContext failed: ...是底层 TLS 后端抛上来的原始信息。真正的原因永远在后半段前半段只是告诉你握手失败了。1.2 为什么 Linux 上跑不报Windows 上必报TLS 后端差异这是理解整件事的关键。curl 本身只是一个 HTTP 客户端外壳真正干 TLS 加密和证书验证的活是交给后端做的。curl 支持多种后端OpenSSL、LibreSSL、BoringSSL、GnuTLS、Rustls以及在 Windows 上使用的 Schannel。你手里的 curl 用的是哪一个curl -V一看便知。Windows 官方渠道发布的 curl包括 Windows 10 1803 之后系统自带的C:\Windows\System32\curl.exe以及 curl 官网下载的 Windows 二进制包默认都链接 Schannel。Schannel 是 Windows 系统级的安全通道实现它有一个很鲜明的特点默认开启完整的证书吊销检查。而 OpenSSL 后端的行为完全不同——它默认根本不查 CRL 和 OCSP除非你显式指定--crlfile之类的参数。这就解释了一个非常典型的现象同一条命令在 Linux 服务器上跑得好好的复制到 Windows 上就报CRYPT_E_REVOCATION_OFFLINE。不是网站有问题也不是你的命令写错了是两边的 TLS 后端对要不要检查吊销这件事的默认态度不一样。Linux 上的 OpenSSL 属于我不管我只验证签名和有效期Windows 上的 Schannel 属于我必须查一遍吊销名单查不到我就不放行。同理Python 的 requests、Node.js 的 https 模块在 Windows 上也不会报这个错因为它们自带 OpenSSL 或者自己的 TLS 栈不走 Schannel。而 .NET 的SslStream、部分走 WinHTTP 的组件则跟 Schannel 是一伙的。搞清这条分界线你就知道为什么同一台机器上浏览器能打开网页、PowerShell 能拉数据偏偏 curl 卡住了。1.3 CRL 与 OCSP吊销检查的两条路走不通就掀桌子证书吊销检查解决的是一个很实际的问题一张证书签出去之后如果私钥泄露了或者域名易主了CA 不可能把证书收回来只能把它的序列号登记到作废名单里。客户端在验证证书时需要拿到这份名单确认手里的证书序列号不在上面。拿名单有两条路。第一条叫 CRL证书吊销列表证书里会带一个CRL Distribution Points字段通常是一个http://开头的地址指向一个.crl文件。客户端把这个文件下载下来在本地比对。第二条叫 OCSP在线证书状态协议证书里带一个Authority Information Access字段里面有一行 OCSP 地址客户端直接构造一个查询请求过去服务器返回good / revoked / unknown。麻烦在于这两个地址经常是理论上存在、实际访问不到的。企业内网签发的证书CDP 地址可能指着一个只有办公网能访问的内网服务器某些 CA 的 CRL 地址用的是明文 HTTP 加非标准端口在严格的安全策略下会被拦掉还有些场景是机器本身处于隔离网络只有少量白名单出口CA 的吊销服务器压根不在名单里。Schannel 一旦遇到我该查但我查不到的情况就返回0x80092013宁可拒绝握手也不放行这就是所谓安全默认值带来的副作用。理解了这一层后面的所有解法其实都在回答同一个问题怎么让 Schannel 接受这次证书虽然没查成吊销但我认了。2. 定位链路五步走到结论别一上来就加 -k2.1 第一步永远是 curl -V确认你手里的 curl 是谁curl -V输出第一行大概长这样curl 8.4.0 (Windows) libcurl/8.4.0 Schannel zlib/1.3 WinIDN Release-Date: 2023-10-11 Protocols: dict file ftp ftps http https ...看到Schannel这个词本篇文章讨论的故障模式才适用。如果这里显示的是OpenSSL/3.x或者LibreSSL那你的报错很可能根本不是吊销检查的问题得换方向查。这一步看着简单但跳过它的人特别多我见过有人在 Git Bash 里折腾半天--ssl-no-revoke没反应最后发现 Git for Windows 自带的 curl 是 OpenSSL 后端那个参数在它眼里是无效选项直接被忽略了。Windows 上还经常出现多个 curl 打架的情况C:\Windows\System32\curl.exe是系统自带的Git 安装目录下有一份Miniconda 或者某些开发工具还会再塞一份到 PATH 里。到底执行的是哪个用where curl或者 PowerShell 里的Get-Command curl确认一下再在同一个终端里curl -V看后端。这两步对得上后面的结论才站得住。2.2 第二步curl -v 看握手停在哪一帧curl -v --ssl-revoke-best-effort https://example.com/install.sh -o /dev/null-v会把整个交互过程打印出来重点看这几处* Connected to ...说明 TCP 通了DNS 没问题* schannel: SSL/TLS connection with ... port 443说明进入握手紧接着如果出现schannel: certificate..然后是报错退出就确认故障点在证书验证而非网络传输。这一步的价值在于区分两类完全不同的场景。第一种是 TCP 都连不上那跟吊销检查没关系去看 2.5 节的错误码表第二种是 TCP 通了、握手走到证书验证才挂那基本就是吊销或者根证书的问题。我一般会在-v的基础上再加一个--trace-time这样每一行带时间戳能看出中间是不是卡了几秒钟才失败——如果卡了 2 到 5 秒通常是在等某个吊销服务器超时这个特征非常有辨识度。2.3 第三步从证书里把 CDP 和 OCSP 地址挖出来确认是证书验证阶段的问题之后得看清楚这张证书到底把吊销名单挂在哪。用 OpenSSL 从证书里直接抽字段openssl s_client -connect example.com:443 -servername example.com -showcerts /dev/null 2/dev/null \ | openssl x509 -noout -ext crlDistributionPoints -ext authorityInfoAccessLinux 和 macOS 上自带 openssl 命令Windows 上可以用 Git 自带的openssl.exe或者用 WSL。你会看到类似URI:http://crl.example-ca.com/root.crl和OCSP - URI:http://ocsp.example-ca.com的输出。拿到这两个地址之后直接在浏览器里访问一下或者用 curl 试一下能不能返回内容curl -v http://crl.example-ca.com/root.crl -o /dev/null如果这一步在你机器上超时、被拒绝或者返回 403那答案就明确了吊销服务器对你的网络不可达。这种情况在企业内网尤其常见——证书是内网 CA 签的CDP 指向内网地址但你的机器连的是另一套网络或者出口策略把明文 HTTP 请求拦掉了。2.4 第四步顺手检查系统时间和证书链完整性时间错位是这类问题里最容易被忽略的隐形杀手。吊销检查和普通的证书有效期校验不一样它依赖 CRL 文件里的thisUpdate和nextUpdate字段如果本机时间比真实时间快了好几天客户端可能认为手里的缓存 CRL 全部过期必须重新拉取如果时间慢了很多又可能认为 CRL 还没生效。Windows 上一条命令校准w32tm /query /status w32tm /resync第二条需要管理员权限虚拟机和长期休眠的笔记本尤其容易出这个问题。另一个要检查的是中间证书。有些服务器配置不规范只发了站点证书中间证书靠客户端去 AIA 地址自动下载。Schannel 会自动去抓如果这个抓取过程失败链条构建不起来错误信息有时候也会以吊销检查失败的形式冒出来。判断方法是拿-v的输出看证书链有几层或者用--cacert传一个包含完整链的 PEM 文件试试。较新版本的 curl 在 Schannel 后端也支持--cacert如果不确定版本行为更稳的做法是把中间证书导入系统的中间证书颁发机构存储区。2.5 一张表看清 curl 常见错误码别把别的病当成这个病命令行报错最怕张冠李戴我把日常最容易撞见的几个 curl 错误码整理成表方便一眼分辨哪些跟吊销检查有关哪些压根是另一回事。错误码curl 官方含义典型诱因跟吊销检查有关吗3URL 格式错误端口写成非数字、URL 含非法字符、方括号没转义无关6无法解析主机名DNS 配置错误、域名拼错、hosts 未配置无关7无法建立连接端口未监听、防火墙拦截、目标地址写错无关28操作超时网络慢、服务端无响应、下载大文件未设超时间接相关35TLS/SSL 握手失败吊销检查失败、协议版本不匹配、加密套件不匹配高度相关60对端证书无法验证自签名证书、证书过期、根证书缺失部分相关77CA 证书读取失败--cacert路径错、文件权限不足、PEM 格式损坏无关判断经验只要看到 35 或者 60且后面跟着schannel:前缀加上CRYPT_E_REVOCATION_OFFLINE那就不用再猜了就是本文要解决的问题。如果 35 后面跟的是SEC_E_UNTRUSTED_ROOT或者CERT_E_EXPIRED那是根证书缺失和证书过期处理方式完全不同。3. 四套解法与它们的真实代价3.1 --ssl-no-revoke三十秒见效但要清楚自己放弃了什么curl --ssl-no-revoke -fsSL https://example.com/install.sh -o install.sh这是最直接的解法语义是告诉 Schannel这次握手不要做吊销检查。它只影响吊销这一项根证书信任、签名校验、主机名匹配、有效期校验全都照常执行所以它比-k温和得多不是一个裸奔模式。代价也很清楚如果这张证书真的被 CA 吊销了而攻击者刚好拿到了它你的 curl 会照常建立连接把请求发过去。对于访问公开的知名站点、下载开源工具的安装脚本这个风险在可接受范围内但如果你的脚本里带着令牌、密钥之类的敏感信息那就要慎重权衡了。还有一个特别容易踩的坑--ssl-no-revoke是 Schannel 专属参数官方文档明确写了它只对 Schannel 后端生效其他后端会直接忽略。很多人遇到我明明加了参数还是报错就是因为执行的那份 curl 其实是 OpenSSL 后端参数被静静丢掉什么也没发生。所以回头看 2.1 节那一步真的不能省。提示--ssl-no-revoke和-k是两回事。前者只关吊销检查后者关整个证书验证链。能用前者解决的场合尽量不要用后者。3.2 --ssl-revoke-best-effort我个人更推荐的折中方案curl --ssl-revoke-best-effort -fsSL https://example.com/install.sh -o install.sh这个参数是 curl 7.70.0 版本引入的语义比--ssl-no-revoke细腻该查吊销还是去查如果能查到就用查询结果但查询失败服务器脱机、超时、返回异常时不再中断握手而是继续往下走。等于把吊销检查从硬性门槛降级成尽力而为。我的偏好很直白凡是遇到这类报错的机器能升到 curl 7.70 以上的一律优先用--ssl-revoke-best-effort。它保留了在吊销服务器可达时发现问题的能力又不会因为一次网络抖动就把整个流程卡死。你需要用curl -V确认版本号如果低于 7.70那就只能用--ssl-no-revoke了。还有一个细节值得注意这个参数同样只对 Schannel 后端有效在 Linux 上写它不会有任何副作用但也不会起任何作用因为 OpenSSL 本来就不做吊销检查。3.3 _curlrc 全局配置一次配置本机所有 curl 调用都受益如果你不想每次都往命令行里塞参数——尤其当你跑的是别人写好的脚本、没法改源码的时候——用 curl 的配置文件是最省事的方案。Windows 上 curl 会按顺序查找%USERPROFILE%\_curlrc找不到再看%APPDATA%\_curlrc。文件名是下划线开头不是点开头这是 Windows 版 curl 的特殊约定。用记事本或者 PowerShell 创建这个文件Add-Content -Path $env:USERPROFILE\_curlrc -Value ssl-revoke-best-effort配置文件的写法是每行一个长选项不带前面的双横线。写完之后新开的终端里所有 curl 调用都会自动带上这个参数包括别人脚本里那些curl -fsSL ... | sh。这个方案对我就是想把机器上所有类似的坑一次性填掉的场景特别合适。需要注意两点。第一_curlrc里的配置会被命令行参数覆盖吗答案是命令行优先基本成立但更保险的理解是两者会合并遇到冲突时命令行通常胜出。第二如果哪天你怀疑配置文件引入了意外行为可以用-q参数让 curl 忽略所有配置文件作为对照测试curl -q -fsSL https://example.com/install.sh -o install.sh注意-q必须放在命令行的最前面才有效放在中间会被当成普通参数处理。3.4 根治派补齐证书链让吊销地址真正可达前三种方案都是客户端让步第四种是把环境修对适合企业内网或者对合规性有要求的场景。具体有三条路可走。第一条是补齐 CA 证书。把内网 CA 的根证书和中间证书导入到受信任的根证书颁发机构和中间证书颁发机构存储区可以用 GUI 双击导入也可以用命令行Import-Certificate -FilePath C:\certs\root-ca.cer -CertStoreLocation Cert:\LocalMachine\Root Import-Certificate -FilePath C:\certs\issuing-ca.cer -CertStoreLocation Cert:\LocalMachine\CA这么做能解决证书链构建的问题但如果 CDP 地址不可达吊销检查照样会失败只是失败的方式可能从链条构建失败变成吊销服务器脱机。第二条是打通吊销服务器的访问。前面 2.3 节挖出来的 CDP 和 OCSP 地址如果指向私网 IP就需要网络策略放行如果是公网 HTTP 地址被出口策略拦了也该把这几个域名加进白名单。这件事通常需要网络或安全团队配合属于一次性投入、长期受益的修法比在每个客户端上加参数靠谱得多。第三条是清掉本机的 CryptNet 缓存。Windows 会把下载过的 CRL、OCSP 响应缓存在本地缓存损坏时会持续报错即便网络已经通了certutil -urlcache * delete这条命令会清空整个 URL 缓存属于低风险操作代价只是下次访问需要重新下载一遍。我遇到过两次网络明明通了但还是一直报脱机清完缓存后立刻恢复。3.5 方案对比表与选型建议方案命令/操作生效范围保留吊销检查推荐场景单次绕过--ssl-no-revoke当前命令完全关闭临时排查、一次性脚本尽力而为--ssl-revoke-best-effort当前命令尽力保留日常首选需 curl 7.70全局配置写入_curlrc当前用户所有 curl尽力保留无法修改脚本源码时导入根证书Import-Certificate当前机器保留企业内网 CA 场景打通吊销地址网络策略放行整网完整保留有网络权限的长期方案清缓存certutil -urlcache * delete当前机器完整保留缓存损坏导致的假故障选型的顺序我一般是这样先试--ssl-revoke-best-effort不行就看版本升级再不行退到--ssl-no-revoke同时并行推进企业内网那边的证书和网络治理。别一上来就用-k那是把安全校验整个关掉属于伤敌一千自损八百。4. 实操全过程从复现到验证成功4.1 最小复现与第一个绿色信号想干净地复现这个错最好找一个 CDP 指向不可达地址的站点或者干脆在一台只有受限出口的机器上跑。复现之后加参数验证curl -v --ssl-revoke-best-effort https://ollama.com/install.sh -o /tmp/install.sh成功的标志是-v输出里出现SSL certificate verify ok之类的字样随后进入 HTTP 请求阶段看到响应头。对比加参数前后的-v输出你会发现失败时停在哪一行、成功时从那行继续往下走这个对照关系一旦记住以后判断同类问题会快很多。我自己的习惯是把失败和成功的两份-v日志都存成文件方便后面比对curl -v https://example.com/install.sh -o /dev/null 2 fail.log curl -v --ssl-revoke-best-effort https://example.com/install.sh -o /dev/null 2 ok.log日志文件在手回头看细节比重跑一遍方便得多尤其在需要跟人解释问题的时候。4.2 用 PowerShell 抓证书再交给 certutil 验证吊销想在 Windows 上彻底看清一张证书的吊销状态可以先用 .NET 的 SslStream 把证书抓下来。这段脚本我用了很多次比较可靠$host_ example.com $tcp New-Object System.Net.Sockets.TcpClient($host_, 443) $ssl New-Object System.Net.Security.SslStream($tcp.GetStream(), $false, ({$true})) $ssl.AuthenticateAsClient($host_, $null, [System.Security.Authentication.SslProtocols]::Tls12, $true) $cert $ssl.RemoteCertificate [IO.File]::WriteAllBytes($env:TEMP\site.cer, $cert.Export(Cert)) $ssl.Close(); $tcp.Close() certutil -urlfetch -verify $env:TEMP\site.cerAuthenticateAsClient第四个参数传$true就是开启吊销检查如果这里抛异常说明你的环境和 curl 遇到了同样的问题。导出的.cer文件交给certutil -urlfetch -verify之后它会逐个去访问证书里的 AIA 和 CDP 地址把每个地址的连通性、下载结果、验证结论都打印出来。这份输出信息量很大直接告诉你到底是哪个 URL 失败了、失败原因是超时还是拒绝连接。看输出的时候重点找两处CRL相关的行看是不是Unable to download或者TimeoutOCSP相关的行看是不是Error状态。找到之后把那个 URL 复制到浏览器里访问基本就能确认是不是网络可达性问题了。4.3 清缓存与校准时间把假故障排掉在动手改配置之前我会先做两件低成本的清理动作。第一件是清 CryptNet 缓存certutil -urlcache * delete第二件是校准时间w32tm /resync这两步加起来不到一分钟却经常能让问题直接消失。尤其在虚拟机快照恢复、笔记本长期合盖休眠之后系统时间跟实际时间偏差几十分钟甚至几小时而 CRL 的nextUpdate字段通常只有几天甚至几小时的有效期时间一乱缓存里的 CRL 全部被判无效客户端就必须重新下载下载不到就报脱机。提示w32tm /resync需要管理员权限。如果返回服务尚未启动先执行net start w32time把时间服务拉起来。我遇到过最离谱的一次是某台测试机时间比真实时间慢了三天所有 curl 全部报吊销脱机校准时间之后一切正常什么参数都不用加。所以现在我的排查顺序里时间校准永远排在改配置前面。4.4 脚本里怎么优雅地兜底如果你维护的是给别人用的安装脚本直接硬写--ssl-no-revoke不太好看可以考虑带降级的写法。这是我常用的一个模式先试尽力而为失败了再退一步#!/usr/bin/env bash URLhttps://example.com/install.sh OUT$(mktemp) if ! curl -fsSL --ssl-revoke-best-effort $URL -o $OUT; then echo 标准下载失败尝试兼容模式... 2 curl -fsSL --ssl-no-revoke $URL -o $OUT || { echo 下载失败请检查网络或手动下载 2 exit 1 } fi # 下载成功后再交给解释器执行避免半截内容进入管道 bash $OUT这里有一个值得说的细节原命令是curl ... | sh管道的好处是省事坏处是如果 curl 中途失败sh会拿到不完整的内容执行行为不可预测。改成先落盘再执行既能检查下载完整性也方便出错时把文件留下来排查。我在好几个脚本里都改成了这个写法虽然少了点一行命令的爽快感但可维护性好了不止一个档次。如果脚本要在多个平台通用可以按后端分派参数CURL_VER$(curl -V) EXTRA case $CURL_VER in *Schannel*) EXTRA--ssl-revoke-best-effort ;; esac curl -fsSL $EXTRA $URL -o $OUT这种写法在 Linux 上EXTRA为空在 Windows 的 Schannel 环境下自动带上参数互不干扰。4.5 在 PowerShell 里做一个透明包装如果你主要在 PowerShell 里工作可以在$PROFILE里加一个包装函数让所有 curl 调用自动带上对这个问题的处理function curl { $env:SystemRoot\System32\curl.exe --ssl-revoke-best-effort args }这样你在 PowerShell 里敲curl实际执行的还是系统那份 curl只是自动加了参数。用args透传所有原始参数curl -v之类的用法完全不受影响。函数定义写在$PROFILE里新开的窗口就生效想看$PROFILE路径用echo $PROFILE。要提醒一句这个函数只在 PowerShell 会话里生效从 cmd 或者别的程序里直接调curl.exe是绕不过去的。所以如果问题出现在某个自动化工具内部还是得靠_curlrc那套方案。5. 踩坑记录与常见问题速查5.1 五个最容易踩的误判第一个误判是加了-k就好了问题解决了。-k是通过关闭整个证书验证链来解决的意味着主机名匹配、有效期校验、签名验证全部失效中间人攻击在这个模式下没有任何阻力。它可以作为最后的验证手段——用来确认问题确实出在证书验证环节——但不应该作为长期方案留在脚本里。第二个误判是把参数加错了位置。curl -fsSL --ssl-no-revoke https://...是对的curl --ssl-no-revoke -fsSL https://...也对但如果你把参数写到了 URL 后面curl 会把它当成另一个待请求的地址产生一些莫名其妙的行为。短选项可以合并成-fsSL长选项必须独立成段。第三个误判是在错误的后端上折腾。前面反复说过--ssl-no-revoke和--ssl-revoke-best-effort只对 Schannel 有效Linux 上写它们等于没写但不报错所以会出现同样加了参数Linux 上不报错但也没变化Windows 上立刻好了这种看似矛盾的现象。判断依据永远是curl -V的第一行。第四个误判是把所有 35 错误都归到吊销上。协议版本不匹配、加密套件协商失败也会给 35。区分方法是看错误码后面跟的符号名CRYPT_E_REVOCATION_OFFLINE才是吊销问题SEC_E_UNTRUSTED_ROOT、SEC_E_NO_CREDENTIALS、SEC_E_ILLEGAL_MESSAGE都是别的病得换药。第五个误判是忽略了证书链本身的问题。有些服务器只发站点证书中间证书靠 AIA 自动抓取抓取失败时的报错可能被包装成吊销相关的信息。这种情况用--ssl-revoke-best-effort也没有用得靠导入中间证书或者用--cacert指定完整链来解决。5.2 常见问题速查表现象最可能的原因处置办法Windows 报CRYPT_E_REVOCATION_OFFLINELinux 正常Schannel 默认做吊销检查OpenSSL 不做用--ssl-revoke-best-effort或写入_curlrc加了--ssl-no-revoke完全没变化执行的是 OpenSSL 后端的 curlcurl -V确认后端必要时改用绝对路径调用 System32 那份报错前卡顿 2 到 5 秒程序在等吊销服务器超时提取 CDP 地址验证可达性走白名单或改用 best-effort网络已通但持续报错CryptNet 本地缓存损坏certutil -urlcache * delete清缓存时快时慢、偶尔能成功系统时间漂移或 CRL 缓存边界w32tm /resync校准时间报错符号名是CERT_E_EXPIRED证书本身过期不是本文问题联系服务方更新证书报错符号名是SEC_E_UNTRUSTED_ROOT根证书缺失导入 CA 根证书到受信任存储区企业内网普遍复现内网 CA 的 CRL 地址对外不可达网络侧放行或统一配置_curlrc提示 60 而不是 35证书验证阶段失败OpenSSL 后端常见检查 CA bundle 路径、证书有效期5.3 几条我自己总结的经验第一先看清楚再动手。把curl -V和curl -v的输出完整看一遍比盲目试参数快得多。我见过有人连续试了七八个参数组合最后发现是--cacert指向的 PEM 文件路径里有个中文目录名导致读取失败跟吊销检查一点关系都没有。第二配置文件优先于命令行参数。原因在于命令行参数只在你手动敲的那一刻有效而配置文件对整个用户会话生效安装脚本、构建流程、CI 里的 curl 调用全都能受益。尤其是在我没法改脚本源码的情况下_curlrc是唯一优雅的出路。第三certutil -urlcache * delete值得放进你的工具箱。它是一个零风险的清理动作能排掉大量明明通了却一直报脱机的假故障。我在两台不同机器上都是靠这条命令解决的事后追溯都是缓存里存着一份早已失效的 CRL 记录。第四别在脚本里长期留着-k。如果某次紧急处理时加了-k记得给自己留个待办事后换成--ssl-revoke-best-effort或者把根证书装好。安全相关的临时方案特别容易变成永久方案这是我在好几个老项目里见过的真实情况。第五把平台差异写进项目文档。如果你们团队的脚本要同时跑 Windows 和 Linux在 README 里加一段说明Windows 上的 curl 用 Schannel 后端时可能需要吊销检查相关的参数并给出curl -V的确认方法。这几行字能省掉后来者半小时的困惑。至于这个问题的后续我个人的做法是在自己的开发机上把ssl-revoke-best-effort写进了_curlrc同时给团队的内网 CA 提了一个补齐中间证书和放行 CRL 地址的需求。前者让我今天就能干活后者让整个团队以后不再被同样的问题绊住。两条腿走路短期和长期都不吃亏。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →