青蛙小白
博客 / 2025/07

curl的根证书cacert.pem

2025/07/27 · — 字 · 阅读约 — 分钟 ·
目录

什么是 cacert.pem

cacert.pem 是一个包含了从Mozilla’s trust store提取的根证书(CA 证书)集合的文件。这个文件由 curl 项目官方维护,并以 PEM(Privacy Enhanced Mail)格式提供。

为什么 curl 需要 cacert.pem

当你使用 curl 通过 HTTPS 协议访问一个网站时,curl 需要验证该网站提供的 SSL 证书是否是由一个可信的证书颁发机构(CA)签发的。cacert.pem 文件就扮演了这个“可信 CA 列表”的角色。

  • 验证服务器身份: cacert.pem 中的根证书允许 curl 验证服务器 SSL 证书的真实性和合法性,确保你正在与预期的服务器通信,而不是一个冒充者。
  • 防止中间人攻击 (MITM): 通过验证证书链,curl 可以防止中间人攻击,即攻击者在你的设备和服务器之间拦截和篡改数据。
  • 建立安全连接: 只有当服务器的证书被 cacert.pem 中的某个根证书所信任时,curl 才会认为连接是安全的,并继续进行数据传输。

如何获取和使用 cacert.pem

你可以从 curl 的官方网站下载最新的 cacert.pem 文件:

curl -O https://curl.se/ca/cacert.pem

下载后,你可以在 curl 命令中使用 --cacert 选项来指定 cacert.pem 文件的路径:

curl --cacert cacert.pem https://google.com

这样,curl 就会使用你提供的 cacert.pem 文件来验证服务器的 SSL 证书。

操作系统的CA证书

Linux/macOS 系统是否自带 CA 证书?

大多数现代操作系统,包括主流的 Linux 发行版(如 Ubuntu, CentOS)和 macOS,都会维护一个系统级的根证书库。这个证书库包含了操作系统信任的 CA 根证书。

  • 在 Linux 系统中,这些证书通常位于 /etc/ssl/certs//etc/pki/tls/certs/ 等路径下。
  • 默认情况下,当你在这些系统上使用 curl 时,它会自动使用系统提供的证书库来验证服务器证书。

系统 CA 证书会过期吗?

CA 根证书也有自己的有效期。如果一个操作系统(尤其是服务器)已经运行了很多年并且没有进行过系统更新,它内置的 CA 证书库就会变得陈旧。

这会导致两个主要问题:

  1. 旧证书过期: 证书库中包含的某些根证书可能已经过期,无法再用于验证新的服务器证书。
  2. 缺少新证书: 新的、受广泛信任的 CA(例如 Let’s Encrypt 的 ISRG Root X1)可能不存在于这个旧的证书库中。

当使用curl或浏览器尝试访问一个由新的或更新后的 CA 签发证书的网站时,由于在本地找不到可信的根证书来形成信任链,就会导致 SSL 证书验证失败,并报告类似 SSL certificate problem: unable to get local issuer certificateGet "https://example.com/": x509: certificate has expired or is not yet valid 的错误。

如何在不升级系统的情况下解决证书问题?

不同的操作系统发型版都提供对应CA证书管理机制。

在 Ubuntu/Debian 系统 上,系统默认的CA 证书系统是由 ca-certificates 包管理的。

sudo apt update
sudo apt install --only-upgrade ca-certificates

在RHEL及其衍生版本(如 CentOS、AlmaLinux、Rocky Linux、Fedora)中系统默认的CA 证书系统也是由 ca-certificates 包管理的。

sudo dnf update ca-certificates  # RHEL 8/9, Fedora 等
# 或
sudo yum update ca-certificates  # RHEL 7

那么curl维护的cacert.pem 文件什么时候使用呢?在一些系统中(例如:精简的 Docker 镜像、内嵌设备)可能找不到系统默认的 CA 证书列表这个时候curl维护的cacert.pem可能就会派上用场。

参考

TAGS # linux
评论