curl 指定 IP 并设置 Host 后,HTTPS 仍提示证书名不匹配
HTTPS 请求 URL 使用 IP 时,修改 Host 不能改变证书验证名称;保留业务域名,用 --resolve 指定源站连接地址。
用 curl https://IP地址/ -H 'Host: 业务域名' 检查某台源站时,HTTP 请求头看起来已经指定了站点,HTTPS 却报证书名称与目标主机不匹配。原因可能就在 URL:curl 仍在按 IP 地址进行 TLS 身份校验。
这适用于要检查负载均衡后的某个节点、迁移前的源站或尚未切换 DNS 的 HTTPS 服务。前提是目标节点确实提供了覆盖业务域名的合格证书;--resolve 不会修复错误或过期的证书。
Host 请求头不能改变先发生的 TLS 握手
以下是错误场景示例,IP 使用文档保留地址:
curl 'https://192.0.2.17/' -H 'Host: example.com'
HTTP Host 头在 TLS 连接建立后才会发送。curl 校验证书的目标名称,以及用于选择 HTTPS 虚拟主机的 SNI,取决于 URL 的主机名;单独修改 Host 并没有把 URL 中的 IP 变成 example.com。
错误文本会随 curl 版本和 TLS 后端变化。旧版本可能出现 certificate subject name ... does not match target host name,当前版本也可能报告没有匹配的备用名称。应核对实际目标名称和证书,不只对照错误编号。
保留域名 URL,只覆盖连接地址
curl 7.21.3 起支持 --resolve。用域名 URL 配合 host、port、address 三项映射:
curl --resolve 'example.com:443:192.0.2.17' \
'https://example.com/'
把域名和地址替换为自己的站点及节点。这样连接地址固定到指定 IP,而 HTTPS 目标名称、SNI 和 HTTP 主机仍来自 example.com。通常无需再加 Host 头,也无需修改系统 hosts 文件。
这个映射只影响本次 curl 进程的对应主机和端口。URL 使用 8443 时,映射也必须写 8443;它不是端口转发功能。如果请求跳转到 www.example.com,那是另一个主机名,应明确决定是否为它增加映射,不能假设一次映射覆盖整个跳转链。
指定地址后仍失败,按失败阶段处理
连接超时或拒绝说明还没有完成 TLS 握手,先核对端口、节点监听和访问限制。出现未知签发机构、过期或主机名不符,则检查该节点实际送出的证书和完整链。多站点服务器要确认站点域名对应的 SNI 配置,而不是只检查默认虚拟主机。
如果使用自己的 CA,需要在已有证书验证机制中配置对应信任,例如 --cacert /path/to/ca.pem;这个文件是受信任 CA 的证书,不是随意从连接中拿到的叶证书。不要用 -k 把“页面返回了”当成证书已经正确。
还要检查 curl 是否经过 HTTP 代理。代理可能负责远端解析和连接,不能把 --resolve 当成对代理的 DNS 配置。需要直连源站且网络允许时,可仅对这个域名排除代理:
curl --noproxy example.com \
--resolve 'example.com:443:192.0.2.17' \
'https://example.com/'
此项会改变该请求的网络路径,不应在依赖代理才能访问的环境里盲目使用。详细连接日志可能含认证或 Cookie 信息,排查时使用无秘密的请求。
恢复标准是指定节点的连接成功、证书验证通过,并返回目标虚拟主机的正常响应。它只证明这一节点和这一条请求路径;切换 DNS 前,还应按自己的发布流程检查其他节点和业务入口。


