HTTPS 是 HTTP 的安全版本,它通过 SSL/TLS 协议对通信进行加密。curl 作为强大的命令行工具,天然支持 HTTPS,并提供了丰富的选项来处理各种与证书、加密相关的情况。

基础用法:发起一个简单的 HTTPS 请求
最基本的使用方式与 HTTP 几乎完全相同,你只需要在 URL 中使用 https:// 协议头即可。
示例:获取 GitHub 的首页 HTML
curl https://www.github.com
当你运行这个命令时,curl 会:
- 建立到
www.github.com的安全连接(通常是 TCP 端口 443)。 - 进行 TLS 握手,验证服务器的 SSL 证书。
- 发送一个 HTTP GET 请求。
- 将服务器返回的 HTML 内容打印到你的终端(标准输出)。
核心概念:SSL/TLS 证书验证
curl 的安全性核心在于对服务器 SSL/TLS 证书的验证,它会检查:

- 证书是否受信任:证书是否由你的系统所信任的证书颁发机构(CA)签名。
- 域名是否匹配:证书中的
Common Name (CN)或Subject Alternative Name (SAN)字段是否与你请求的域名(www.github.com)匹配。 - 证书是否过期:证书是否在有效期内。
如果任何一项验证失败,curl 默认会拒绝连接并报错。
常见场景与选项详解
忽略证书验证(不安全,仅用于测试)
在某些开发或测试环境中,你可能会遇到自签名证书、域名不匹配或证书过期的 HTTPS 服务,为了临时绕过验证,可以使用 -k 或 --insecure 选项。
警告: 这会使得你的连接容易受到中间人攻击,绝不应在生产环境或处理敏感数据时使用。
# -k 或 --insecure curl -k https://self-signed.badssl.com
查看详细的 SSL/TLS 握手信息
如果你想了解 curl 是如何与服务器建立安全连接的,可以使用 -v(verbose)或 --trace 选项。

示例:使用 -v 查看连接过程
curl -v https://www.github.com
输出中会包含类似以下信息,展示了证书链、使用的加密算法、TLS 版本等:
* Trying 140.82.121.3:443...
* Connected to www.github.com (140.82.121.3) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: none
* (304) (OUT), TLS handshake, Client hello (1):
* (304) (IN), TLS handshake, Server hello (2):
* (304) (IN), TLS handshake, Unknown (8):
* (304) (IN), TLS handshake, Certificate (11):
* (304) (IN), TLS handshake, CERT verify (15):
* (304) (IN), TLS handshake, Finished (20):
* (304) (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
...
指定自定义的 CA 证书文件
如果你的服务器使用的是由私有 CA 签名的证书,你需要告诉 curl 去哪里找这个 CA 的证书文件,以便它能够正确验证服务器证书。
使用 --cacert 选项来指定 CA 证书文件的路径。
# 假设你的 CA 证书文件是 my-ca.crt curl --cacert /path/to/my-ca.crt https://my-private-server.com
从特定目录加载 CA 证书
如果你有多个 CA 证书文件,并将它们放在一个目录中,可以使用 --capath 选项。
curl --capath /path/to/my_ca_directory/ https://my-private-server.com
查看服务器的 SSL 证书信息
如果你想在不建立完整连接的情况下,只获取服务器的 SSL 证书信息,可以使用 -v 选项,然后将输出重定向到 /dev/null 以隐藏网页内容。
# -v 显示连接信息,-s/--silent 隐藏进度表 curl -v -s https://www.github.com 1>/dev/null
或者使用 openssl 命令(更直接):
openssl s_client -connect github.com:443 -showcerts
调试 TLS 连接问题
如果遇到 TLS 相关的错误,--trace 或 --trace-ascii 是非常有用的调试工具,它们会记录 curl 执行的每一个细节,包括网络数据包。
# 将所有调试信息输出到 trace.txt 文件 curl --trace trace.txt https://www.github.com
实战演练:常见错误与解决方案
错误 1:curl: (60) SSL certificate problem: unable to get local issuer certificate
- 原因:
curl找不到用于验证服务器证书的根 CA 证书,这通常发生在没有正确配置 CA 证书路径的环境中(在 Docker 容器或某些最小化安装的 Linux 系统中)。 - 解决方案:
- 最佳实践:安装或更新系统的 CA 证书包。
- Ubuntu/Debian:
sudo apt-get update && sudo apt-get install ca-certificates - CentOS/RHEL:
sudo yum install ca-certificates
- Ubuntu/Debian:
- 临时方案:使用
--cacert指定一个有效的 CA 证书文件。 - 不推荐:使用
-k忽略验证(仅限测试)。
- 最佳实践:安装或更新系统的 CA 证书包。
错误 2:curl: (51) SSL: unable to negotiate protocol
- 原因:客户端(
curl)和服务器之间没有共同支持的 SSL/TLS 协议版本或加密套件,服务器只支持非常老旧的 SSLv3,而curl默认不再支持它。 - 解决方案:
- 更新
curl:确保你使用的是较新版本的curl,它支持更现代的 TLS 协议(如 TLS 1.2, 1.3)。 - 指定 TLS 版本:可以使用
--tlsv1.2或--tlsv1.3来强制使用特定版本的协议。curl --tlsv1.2 https://www.github.com
- 更新
错误 3:curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL
- 原因:这是一个底层的 I/O 错误,通常表示在 TCP 连接建立后,SSL/TLS 握手阶段发生了网络问题,或者服务器在 SSL 层面崩溃了。
- 解决方案:
- 检查网络连接是否通畅。
- 尝试连接其他 HTTPS 网站以确认问题是否出在目标服务器上。
- 使用
-v选项获取更详细的连接信息,看是在哪一步失败的。
| 场景 | 命令 | 说明 |
|---|---|---|
| 基本请求 | curl https://example.com |
发起一个标准的 HTTPS GET 请求。 |
| 忽略证书 | curl -k https://example.com |
不安全,跳过 SSL 证书验证。 |
| 查看详情 | curl -v https://example.com |
显示详细的连接和握手过程。 |
| 指定 CA 证书 | curl --cacert /path/to/ca.crt https://example.com |
使用自定义的 CA 证书文件来验证服务器。 |
| 调试 | curl --trace trace.txt https://example.com |
将所有操作细节记录到文件,用于深度调试。 |
| 强制 TLS 版本 | curl --tlsv1.2 https://example.com |
强制使用 TLS 1.2 协议进行连接。 |
掌握这些选项,你就能在命令行中灵活、安全地与任何 HTTPS 服务进行交互。永远优先选择修复证书问题,而不是使用 -k 来绕过它。
