curl 排查 HTTPS 访问失败:区分 DNS、连接、证书与 HTTP 状态
HTTPS 访问失败时,先区分 curl 的退出码与服务器返回的 HTTP 状态,再核对 DNS、连接和证书。收到 404 或 500 说明已拿到 HTTP 响应,不能仅凭 curl 命令正常退出就认定业务健康;证书失败也不应靠跳过校验来解决。
适用环境与前提
适用于 Linux shell 中支持 HTTPS 的 curl 7.58.0 及以上版本,本文仅使用长期可用选项,不要求安装最新开发版。先执行 curl --version,确认版本、TLS 后端和 HTTPS 支持。本文为 AI 辅助的 curl 官方资料整理,未对读者目标环境实测;域名和地址均为占位示例,只测试自己管理或获授权的服务。
一、用一次 GET 同时记录状态与退出码
curl --version
curl --silent --show-error --connect-timeout 5 --max-time 20 --output /dev/null --write-out 'http=%{http_code} remote=%{remote_ip}\n' https://www.example.com/
rc=$?
printf 'curl_exit=%s\n' "$rc"将域名换成实际目标。--output /dev/null 丢弃响应体,--write-out 输出传输信息;--silent 配合 --show-error 隐藏进度但保留错误。rc 必须紧接 curl 保存,避免被后一条命令覆盖。字段格式见 curl 官方 write-out 说明。
5 秒限制连接阶段,包含 DNS 和握手;20 秒限制整个操作。这是排查示例值,不是通用性能标准。慢请求可能因人为设置过短而超时,参数含义见 curl 超时说明。本例不自动跟随跳转,也不使用 HEAD,以免与真实 GET 路径混淆。
二、读懂失败发生在哪一层
- 退出码 6:主机名未能解析,先核对名称与解析环境。
- 退出码 7:建立连接失败,检查实际地址、监听端口及路径。
- 退出码 28:达到超时限制,结合错误文本确认阶段。
- 退出码 35 或 60:分别可能涉及 TLS 握手或证书验证,继续看具体错误。
完整定义见 curl 官方退出码说明。本例没有 --fail,HTTP 4xx/5xx 本身通常不使 curl 返回非零;反过来,HTTP 显示 000 也不是服务器发出的正式状态。退出码与 HTTP 状态应分别记录,不能互相替代。
三、指定目标地址时保留域名身份
若要比较解析所得地址与管理员确认的目标地址,可为单次请求指定 --resolve:
curl --resolve www.example.com:443:192.0.2.10 --connect-timeout 5 --max-time 20 --output /dev/null --write-out 'http=%{http_code}\n' https://www.example.com/192.0.2.10 为文档示例,不能当成实际服务地址。URL 仍保留域名,因此 SNI 与证书主机名校验仍针对该名称。仅把 URL 改成 IP 再增加 Host 头不能等价替代 HTTPS 域名测试。参见 curl 官方名称解析技巧。若使用代理,需先确认实际连接路径,不能默认该结果就是直连源站。
四、证书失败先检查信任关系
curl 默认验证证书及 URL 中的服务器名称。检查本机时间、证书有效期、链是否完整、域名是否匹配,以及本机信任库是否适合当前环境。内部 CA 场景可使用管理员可信渠道提供的 CA 文件:
curl --cacert /实际路径/company-ca.pem --connect-timeout 5 --max-time 20 https://www.example.com/不要把 --insecure 或 -k 固化进生产探测脚本。TLS 后端和信任库差异、--cacert 的用法见 curl 证书校验文档。
验证与常见误判
修正一个条件后重复同一请求,保留时间、目标、来源网络、代理状态、错误文本和 HTTP 状态。拿到预期状态后仍需使用业务客户端验证登录、页面或 API 内容;首页 200 不代表所有功能正常。分享日志前清理 Cookie、令牌和内部信息,不要直接公开 verbose 输出。
浏览器能打开而 curl 失败怎么办?先比较代理、DNS、CA 信任与登录状态;两种客户端的环境可能不同,不要立即归因于服务宕机。
相关阅读
- Windows TCP 端口与 DNS 排查:理解网络测试的边界。
- Nginx 配置检查与安全重载:确认故障源于配置后再处理服务。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭