菜鸟科技网

curl 命令 https

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

curl 命令 https-图1
(图片来源网络,侵删)

基础用法:发起一个简单的 HTTPS 请求

最基本的使用方式与 HTTP 几乎完全相同,你只需要在 URL 中使用 https:// 协议头即可。

示例:获取 GitHub 的首页 HTML

curl https://www.github.com

当你运行这个命令时,curl 会:

  1. 建立到 www.github.com 的安全连接(通常是 TCP 端口 443)。
  2. 进行 TLS 握手,验证服务器的 SSL 证书。
  3. 发送一个 HTTP GET 请求。
  4. 将服务器返回的 HTML 内容打印到你的终端(标准输出)。

核心概念:SSL/TLS 证书验证

curl 的安全性核心在于对服务器 SSL/TLS 证书的验证,它会检查:

curl 命令 https-图2
(图片来源网络,侵删)
  1. 证书是否受信任:证书是否由你的系统所信任的证书颁发机构(CA)签名。
  2. 域名是否匹配:证书中的 Common Name (CN)Subject Alternative Name (SAN) 字段是否与你请求的域名(www.github.com)匹配。
  3. 证书是否过期:证书是否在有效期内。

如果任何一项验证失败,curl 默认会拒绝连接并报错。


常见场景与选项详解

忽略证书验证(不安全,仅用于测试)

在某些开发或测试环境中,你可能会遇到自签名证书、域名不匹配或证书过期的 HTTPS 服务,为了临时绕过验证,可以使用 -k--insecure 选项。

警告: 这会使得你的连接容易受到中间人攻击,绝不应在生产环境或处理敏感数据时使用。

# -k 或 --insecure
curl -k https://self-signed.badssl.com

查看详细的 SSL/TLS 握手信息

如果你想了解 curl 是如何与服务器建立安全连接的,可以使用 -v(verbose)或 --trace 选项。

curl 命令 https-图3
(图片来源网络,侵删)

示例:使用 -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 系统中)。
  • 解决方案
    1. 最佳实践:安装或更新系统的 CA 证书包。
      • Ubuntu/Debian: sudo apt-get update && sudo apt-get install ca-certificates
      • CentOS/RHEL: sudo yum install ca-certificates
    2. 临时方案:使用 --cacert 指定一个有效的 CA 证书文件。
    3. 不推荐:使用 -k 忽略验证(仅限测试)。

错误 2:curl: (51) SSL: unable to negotiate protocol

  • 原因:客户端(curl)和服务器之间没有共同支持的 SSL/TLS 协议版本或加密套件,服务器只支持非常老旧的 SSLv3,而 curl 默认不再支持它。
  • 解决方案
    1. 更新 curl:确保你使用的是较新版本的 curl,它支持更现代的 TLS 协议(如 TLS 1.2, 1.3)。
    2. 指定 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 层面崩溃了。
  • 解决方案
    1. 检查网络连接是否通畅。
    2. 尝试连接其他 HTTPS 网站以确认问题是否出在目标服务器上。
    3. 使用 -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 来绕过它

分享:
扫描分享到社交APP
上一篇
下一篇