用 curl 验证 HTTPS 行为
curl 代表真实客户端视角:它能告诉你证书是否被系统信任、实际协商到哪个版本与套件、重定向链是否合理,以及 HTTP 版本与响应指标。调试多后端或 DNS 未生效时,--resolve 可以在不改 hosts 的前提下直连指定 IP,同时保持正确的 SNI 与域名校验。
基本信息
| -v 或 -vI | 打印握手与证书细节,含校验结果 |
|---|---|
| --tlsv1.3 与 --tls-max 1.2 | 限定或限制协议版本做兼容性测试 |
| --cacert | 指定自定义 CA 包,用于私有 CA 场景 |
| --resolve HOST:443:IP | 绕过 DNS 指定目标 IP,同时按域名校验证书与发 SNI |
| -w | 输出 http_code、ssl_verify_result、http_version 等指标 |
| -k | 关闭证书校验,仅限临时定位使用 |
典型使用场景
- 上线验收:确认新证书被系统信任且协商版本符合预期
- 多后端排查:用 --resolve 指定某台后端,确认各实例证书一致
- 私有 CA 场景:用 --cacert 指定企业 CA 验证内部站点
- 重定向核对:确认 HTTP 到 HTTPS 的跳转链与最终地址
- 自动化巡检:用 -w 输出版本与校验码,写入监控脚本
常用验证命令
常用验证命令
# 查看握手细节与证书主体、签发者
curl -vI https://example.com 2>&1 | grep -E 'SSL connection|subject|issuer|HTTP/'
# 输出状态码、协议版本与证书校验结果(0 表示校验通过)
curl -s -o /dev/null -w 'code=%{http_code} http=%{http_version} verify=%{ssl_verify_result}\n' https://example.com
# 指定后端 IP 但保持域名校验与 SNI
curl -s --resolve example.com:443:203.0.113.10 https://example.com -o /dev/null -w '%{http_code}\n'
# 限定协议版本做兼容性测试
curl -s --tlsv1.3 --tls-max 1.3 -o /dev/null -w '%{http_version}\n' https://example.com
# 跟踪跳转链,确认最终落地地址与状态码
curl -sIL http://example.com | grep -iE 'HTTP/|location'关键变量读法
| 变量 | 含义 | 正常与异常 |
|---|---|---|
| http_code | HTTP 状态码 | 200 正常;301/302 表示发生跳转;5xx 表示服务端异常 |
| ssl_verify_result | 证书校验结果,0 表示通过 | 非 0 表示链、域名或有效期问题 |
| http_version | 实际使用的 HTTP 版本 | 1.1 或 2;若期望 2 却为 1.1 说明协商未成功 |
| time_connect 与 time_appconnect | TCP 与 TLS 建连耗时 | 可用于区分网络延迟与握手开销 |
| redirect_url | 最终跳转目标 | 应指向 https 且域名正确 |
-k 会关闭证书校验,只适合临时定位问题。它常被写进脚本并长期保留,结果是把链缺失、域名不匹配、证书过期等问题全部掩盖,等到真实客户端报错时才暴露。生产脚本与巡检工具中不应出现该参数。
在负载均衡后测试单台后端时,优先使用 --resolve 而不是修改 hosts:它只影响本次请求,能同时保持正确的 SNI 与域名校验,测试完成后不需要清理环境。