curl SSL、TLS 与代理配置指南

curl 中配置 HTTPS 证书、TLS 版本、代理和自定义 DNS 解析对于安全 API 通信、CI/CD 流水线和调试网络问题至关重要。本指南涵盖所有 SSL、TLS、代理和网络选项——从使用 -k 禁用证书检查用于本地开发,到使用 --cert 设置双向 TLS 以及通过 SOCKS5 代理路由流量。每个选项都包含清晰的说明、安全考虑事项和可直接复制的示例。

SSL 与代理选项快速参考

-kSSL/TLS

允许不安全连接——跳过所有 SSL 验证

--cacertSSL/TLS

使用特定 CA 包验证服务器证书

--certSSL/TLS

提供客户端证书用于双向 TLS 认证

--keySSL/TLS

提供客户端证书的私钥文件

--tlsv1.2SSL/TLS

连接使用 TLS 1.2 或更高版本

--tlsv1.3SSL/TLS

连接使用 TLS 1.3 或更高版本

--ssl-reqdSSL/TLS

要求连接使用 SSL/TLS(不可用时失败)

--ciphersSSL/TLS

指定连接使用的 SSL 密码套件

--cert-typeSSL/TLS

指定客户端证书类型(PEM、DER、ENG、P12)

--pinnedpubkeySSL/TLS

固定并验证服务器公钥(HPKP 风格)

-x代理

将所有流量通过指定代理服务器路由

--socks5代理

通过 SOCKS5 代理路由连接

提供代理服务器的用户名:密码

--noproxy代理

不应通过代理的主机列表

--socks5-hostname代理

通过代理进行 DNS 解析的 SOCKS5 代理

--proxy-cacert代理

用于验证 HTTPS 代理本身的 CA 证书

--resolve网络

将特定 host:port 对映射到自定义 IP 地址

连接到与 URL 指定不同的 host:port

--local-port网络

设置连接的本地端口号或范围

--interface网络

将连接绑定到特定网络接口

--dns-servers网络

使用自定义 DNS 服务器替代系统默认值(c-ares)

curl -k:忽略 SSL 证书错误

功能说明
-k(或 --insecure)选项禁用所有 SSL/TLS 证书验证。curl 不会检查服务器证书是否由受信任的 CA 签名、主机名是否匹配或证书是否已过期。
使用场景
用于使用自签名证书的本地开发或测试环境。对于预发布/生产环境,请改用 --cacert 加实际 CA 证书——更安全也更明确。
$ curl -k https://localhost:8443/api/health

切勿在生产脚本或 CI/CD 流水线中使用 -k。它禁用所有证书验证,使您的连接容易遭受中间人攻击。请改用 --cacert 信任特定 CA。

curl --cacert:使用自定义 CA 证书

功能说明
--cacert 选项告诉 curl 使用特定的 PEM 格式 CA(证书颁发机构)包文件验证服务器的 SSL 证书,而非系统默认的信任存储。
使用场景
当您的服务器使用不在系统信任存储中的私有或内部 CA 签名的证书时使用。这在企业环境、Kubernetes 集群和使用内部 PKI 的 Docker 配置中很常见。
$ curl --cacert /path/to/corporate-ca.pem https://internal-api.example.com/data

curl --cert:客户端证书(双向 TLS)

功能说明
--cert 选项提供客户端证书用于双向 TLS(mTLS)。在 mTLS 中,服务器和客户端都需要提供证书来验证对方身份。证书文件应为 PEM 或 PKCS#12 格式。
使用场景
当服务器要求客户端证书认证时必需——常见于银行 API、政府服务、IoT 设备通信和零信任架构。除非密钥已嵌入证书文件,否则始终与 --key 搭配使用。
$ curl --cert client.pem --key client-key.pem https://mtls-api.example.com/secure

curl --key:客户端证书私钥

功能说明
--key 选项指定与 --cert 提供的客户端证书配对的私钥文件。密钥必须与证书匹配。如果密钥受密码保护,curl 将提示输入密码(或使用 --pass)。
使用场景
始终与 --cert 一起使用。如果私钥已嵌入证书文件中(PKCS#12 / .p12 文件常见此情况),可省略 --key
$ curl --cert client.pem --key client-key.pem --cacert server-ca.pem https://api.example.com/secure

curl --tlsv1.2:强制最低 TLS 1.2

功能说明
--tlsv1.2 选项强制 curl 使用 TLS 1.2 作为 SSL/TLS 握手的最低可接受版本。较旧的协议(TLS 1.0、1.1、SSLv3)将被拒绝。
使用场景
用于强制执行最低安全标准。TLS 1.2 是 PCI-DSS 合规所必需的,所有现代服务器都支持。大多数现代 curl 构建默认已使用 TLS 1.2+,但此选项使其明确化。
$ curl --tlsv1.2 -v https://secure.example.com/api 2>&1 | grep 'SSL connection'

curl --tlsv1.3:强制最低 TLS 1.3

功能说明
--tlsv1.3 选项强制 curl 使用 TLS 1.3——最快速、最安全的 TLS 版本。TLS 1.3 消除了握手中的额外往返(支持 0-RTT)并移除了所有过时的密码套件。
使用场景
当您知道服务器支持 TLS 1.3 且想要最佳性能和安全性时使用。注意:TLS 1.3 需要 OpenSSL 1.1.1+ 或兼容的 TLS 库。并非所有服务器都已支持。
$ curl --tlsv1.3 https://modern-api.example.com/data

其他 SSL/TLS 选项

--ssl-reqd

要求连接使用 SSL/TLS(不可用时失败)

--ciphers

指定连接使用的 SSL 密码套件

--cert-type

指定客户端证书类型(PEM、DER、ENG、P12)

--pinnedpubkey

固定并验证服务器公钥(HPKP 风格)

curl -x:使用 HTTP/HTTPS 代理

功能说明
-x(或 --proxy)选项将所有 curl 流量通过指定代理服务器路由。格式为 [protocol://]host[:port]。支持的代理协议:HTTP、HTTPS、SOCKS4、SOCKS5。
使用场景
用于企业代理服务器、使用 Fiddler、Charles 或 mitmproxy 等工具调试、测试地理限制,或无法直接访问互联网时。也可以设置 http_proxy / https_proxy 环境变量替代。
$ curl -x http://proxy.example.com:8080 https://api.example.com/data

curl --socks5:使用 SOCKS5 代理

功能说明
--socks5 选项告诉 curl 使用 SOCKS5 代理进行 TCP 连接。与 HTTP 代理不同,SOCKS5 在 TCP 层运行,可以处理任何协议——不仅是 HTTP。默认情况下 DNS 在本地解析;使用 --socks5-hostname 通过代理解析 DNS。
使用场景
用于 SSH 隧道(ssh -D)、Tor 网络访问,或代理必须处理非 HTTP 协议时。SOCKS5 支持 UDP 并可选择性处理 DNS——使其比 HTTP 代理更灵活。
$ curl --socks5 localhost:1080 https://api.example.com/data

curl --proxy-user:代理认证

功能说明
--proxy-user(或 -U)选项向代理服务器发送认证凭据。格式为 user:password。这与服务器认证(-u)是分开的。
使用场景
当代理服务器要求认证时必需——在企业网络环境中很常见。凭据发送到代理,而非目标服务器。
$ curl -x http://proxy.corp.com:3128 -U user:pass https://external-api.com/data

curl --noproxy:对特定主机绕过代理

功能说明
--noproxy 选项指定以逗号分隔的主机、域名或 IP 地址列表,这些地址应绕过代理直接连接。支持通配符:*.example.com 匹配所有子域名。
使用场景
用于将 localhost、内部服务或特定域名排除在代理之外。当代理通过环境变量全局设置但某些主机(如本地服务)需要直接访问时很重要。使用 * 对所有主机绕过代理。
$ curl -x http://proxy:8080 --noproxy "localhost,127.0.0.1,*.internal.com" https://localhost:3000/api

其他代理选项

--socks5-hostname

通过代理进行 DNS 解析的 SOCKS5 代理

--proxy-cacert

用于验证 HTTPS 代理本身的 CA 证书

curl --resolve:自定义 DNS 解析

功能说明
--resolve 选项为特定 host:port 对提供自定义 IP 地址,完全绕过 DNS 查找。格式为 host:port:address。可提供多个 --resolve 条目。
使用场景
在 DNS 传播之前测试、验证负载均衡器后面的特定后端,或需要真实主机名进行 SSL 证书验证的本地开发中非常重要。与编辑 /etc/hosts 不同,这是按请求和端口特定的。
$ curl --resolve api.example.com:443:127.0.0.1 https://api.example.com/health

curl --connect-to:将连接重定向到不同主机

功能说明
--connect-to 选项将 TCP 连接重定向到不同的 host:port 对,同时保留原始 URL 用于 HTTP 请求(包括 Host 头部和 SNI)。格式:HOST1:PORT1:HOST2:PORT2
使用场景
用于在不修改 DNS 或 /etc/hosts 的情况下测试负载均衡器后面的特定后端服务器。与 --resolve 不同,这将 host:port 映射到 host:port(而非 IP),当目标也有主机名时很有用。
$ curl --connect-to api.example.com:443:backend1.internal:8443 https://api.example.com/health

其他网络选项

--local-port

设置连接的本地端口号或范围

--interface

将连接绑定到特定网络接口

--dns-servers

使用自定义 DNS 服务器替代系统默认值(c-ares)

实际 SSL 与代理场景

这些示例组合多个选项来处理开发、CI/CD 和生产环境中常见的安全和网络任务。

在 Localhost 上测试 HTTPS

使用自签名证书进行本地开发时,将 --resolve--cacert(或快速测试使用 -k)组合。这让您可以使用真实主机名进行正确的 SSL/SNI 而无需修改 hosts 文件。

$ curl --resolve myapp.local:443:127.0.0.1 --cacert local-ca.pem https://myapp.local/api/status

双向 TLS(客户端证书认证)

某些 API 要求服务器和客户端都提供证书。提供 --cert--key--cacert 来建立完全验证的双向 TLS 连接。

$ curl --cert client.pem --key client-key.pem --cacert server-ca.pem https://mtls-api.example.com/data

带认证的企业代理

在有强制代理服务器的企业网络中,将 -x-U 组合提供代理凭据。添加 --noproxy 将内部服务排除在代理之外。

$ curl -x http://proxy.corp.com:3128 -U user:pass --noproxy "*.internal.corp" https://external-api.com/data

使用内部 CA 的 Docker 容器

当 Docker 中的服务使用来自内部 CA 的证书时,将 CA 证书挂载到容器中并通过 --cacert 引用。这比 -k 更安全,因为它仍然验证证书链。

$ curl --cacert /etc/ssl/certs/internal-ca.crt https://service.docker.internal:8443/health

通过 SSH 隧道的 SOCKS5 代理

使用 ssh -D 创建 SOCKS5 代理,并使用 --socks5 通过它路由 curl 流量。这对于通过堡垒机访问内部服务很有用。

$ curl --socks5 localhost:1080 https://internal-api.example.com/status

curl SSL 与代理常见问题

如何在 curl 中跳过 SSL 证书验证?

使用 curl -k URLcurl --insecure URL。这将禁用所有证书检查——过期、主机名不匹配、不受信任的 CA。用于本地开发。生产环境请使用 --cacert 加实际 CA 证书。

如何让 curl 信任自签名证书?

使用 curl --cacert /path/to/ca.pem URL 指定签署您自签名证书的 CA 证书。这比 -k 更安全,因为它仍然验证证书链——只信任您的特定 CA。

如何检查 curl 正在使用哪个 TLS 版本?

运行 curl -v URL 并在详细输出中查找 * SSL connection using TLSv1.x / CipherSuite 行。要强制使用特定版本,使用 --tlsv1.2--tlsv1.3

什么是双向 TLS(mTLS),如何在 curl 中使用?

双向 TLS 要求服务器和客户端都提供证书。使用:curl --cert client.pem --key client-key.pem --cacert server-ca.pem URL--cert/--key 对认证客户端;--cacert 验证服务器。

如何通过 HTTP 代理使用 curl?

使用 curl -x http://proxy:port URL。HTTPS 代理:curl -x https://proxy:port URL。也可以设置 http_proxyhttps_proxy 环境变量——curl 会自动识别。

如何将 curl 与 SOCKS5 代理一起使用?

本地 DNS 解析使用 curl --socks5 host:port URL,通过代理解析 DNS 使用 curl --socks5-hostname host:port URL(对隐私/Tor 很重要)。SSH 隧道示例:ssh -D 1080 user@bastion,然后 curl --socks5 localhost:1080 URL

如何在 curl 中对代理服务器进行认证?

使用 curl -x http://proxy:port -U user:password URL-U(或 --proxy-user)选项将凭据发送到代理。这与 -u 不同,后者是对目标服务器进行认证。

如何在 curl 中将某些主机排除在代理之外?

使用 --noproxy "localhost,127.0.0.1,*.internal.com" 或设置 NO_PROXY 环境变量。支持通配符(*.example.com)。使用 --noproxy "*" 对单个请求完全绕过代理。

如何用 curl 在 localhost 上测试 HTTPS?

快速测试:curl -k https://localhost:8443/。正确验证:curl --resolve myapp.local:443:127.0.0.1 --cacert local-ca.pem https://myapp.local/--resolve 方式让证书主机名正确匹配。

如何在 curl 中覆盖特定主机的 DNS 解析?

使用 curl --resolve host:port:IP URL。示例:curl --resolve api.example.com:443:192.168.1.100 https://api.example.com/。这仅绕过该 host:port 对的 DNS——无需编辑 /etc/hosts

如何修复 curl 中 'SSL certificate problem: certificate has expired' 错误?

服务器证书已过期。解决方案:(1) 在服务器上续期证书,(2) 更新 CA 包:curl --cacert /path/to/updated-ca.pem URL,(3) 仅测试用:curl -k URL。检查到期时间:curl -v URL 2>&1 | grep expire

在生产环境中使用 curl --insecure (-k) 安全吗?

不安全。-k 选项禁用所有证书验证——过期、主机名和信任链。这使您的连接容易遭受中间人攻击。在生产环境和 CI/CD 流水线中始终使用 --cacert 加特定 CA 证书。