信任库是操作系统用来验证 TLS/SSL 证书(如 HTTPS 网站、API 调用)合法性的根证书集合。
不同发行版的 Linux 系统使用不同的机制来管理信任库,但核心思想是一致的:将自定义的 CA 证书放入特定的“源”目录,然后运行一个命令来更新系统最终使用的信任库。
一、主流 Linux 发行版的信任库体系
1. RHEL / CentOS / Rocky / AlmaLinux (基于ca-certificates包)
这是 Red Hat 系列发行版的标准方式。
工作流程:
- 放置证书: 将自定义 CA 证书(
.crt或.pem格式)复制到源目录。 - 更新信任库: 运行
update-ca-trust命令,该命令会读取所有源目录中的证书,并生成系统应用程序实际使用的信任库。
- 放置证书: 将自定义 CA 证书(
关键目录和文件:
目录/文件 作用 说明 /etc/pki/ca-trust/source/anchors/主要源目录 这是应该放置自定义 CA 证书的地方。放入此目录的证书会被无条件信任。 /etc/pki/ca-trust/source/其他源目录 此目录下还有其他子目录(如 blacklist),用于更精细的控制。通常只需关注anchors。/etc/pki/ca-trust/extracted/最终信任库 这是系统和应用程序实际读取信任证书的地方。此目录由 update-ca-trust命令自动生成和维护,请勿手动修改。/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pemPEM 格式的信任链 OpenSSL 库等工具通常会读取这个文件或其所在目录。 /etc/pki/ca-trust/extracted/java/cacertsJava 格式的信任库 Java 应用程序 ( keytool) 使用的格式。操作命令:
# 1. 将CA 证书 (例如 my-ca.crt) 复制到 anchors 目录sudocpmy-ca.crt /etc/pki/ca-trust/source/anchors/# 2. 更新系统信任库sudoupdate-ca-trust# 3. [可选] 验证证书是否已包含在信任库中# 查找证书的指纹 (Fingerprint)openssl x509-inmy-ca.crt-noout-fingerprint-sha256# 输出示例: SHA256 Fingerprint=AA:BB:CC:...# 在系统信任库中搜索该指纹openssl x509-in/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem-noout-fingerprint-sha256|grep"AA:BB:CC"
2. Ubuntu / Debian (基于ca-certificates包)
Debian 系列发行版使用一套类似的逻辑,但路径不同。
工作流程:
- 放置证书: 将自定义 CA 证书复制到源目录。
- 更新信任库: 运行
update-ca-certificates命令来生成最终的信任库。
关键目录和文件:
目录/文件 作用 说明 /usr/local/share/ca-certificates/主要源目录 这是应该放置自定义 CA 证书的地方。放入此目录的证书会被信任。 /etc/ssl/certs/最终信任库 这是系统和应用程序实际读取信任证书的地方。此目录由 update-ca-certificates命令管理。它包含大量以哈希值命名的证书软链接和一个聚合文件。/etc/ssl/certs/ca-certificates.crt聚合的信任链文件 这是一个包含了 /etc/ssl/certs/目录下所有证书的单一文件。很多工具(如curl,wget)默认会读取这个文件。操作命令:
# 1. 将CA 证书 (例如 my-ca.crt) 复制到源目录sudocpmy-ca.crt /usr/local/share/ca-certificates/# 2. 更新系统信任库sudoupdate-ca-certificates# 3. [可选] 验证# 检查聚合文件是否包含自定义的证书grep-A20"Your CA's Subject"/etc/ssl/certs/ca-certificates.crt# 或者检查 /etc/ssl/certs/ 目录下是否有对应的软链接ls/etc/ssl/certs/|grep$(openssl x509-inmy-ca.crt-noout-subject_hash)
二、通用验证方法
无论使用哪个发行版,都可以通过以下方法来验证系统是否信任某个 CA。
1. 使用openssl s_client测试连接
这是最直接的方法,可以模拟一个 TLS 客户端。
# 如果服务使用自建 CA 签发的证书,此命令应返回 "Verify return code: 0 (ok)"openssl s_client-connectyour-service.internal:443-servernameyour-service.internal如果返回Verify return code: 19 (self signed certificate in certificate chain)或21 (unable to verify the first certificate),则说明系统不信任该 CA。
2. 检查环境变量
有些应用程序(特别是用 Pythonrequests库开发的)可能会被环境变量覆盖,从而不使用系统的信任库。
SSL_CERT_FILE: 指向一个特定的 CA bundle 文件。SSL_CERT_DIR: 指向一个包含 CA 证书的目录。CURL_CA_BUNDLE/REQUESTS_CA_BUNDLE: 专为curl和 Pythonrequests库设置的变量。
在排查问题时,请检查这些变量是否被设置:
env|grep-icert3. 查看 OpenSSL 的默认配置
OpenSSL 库本身也有配置文件,可以指定 CA 路径。
# 查看 OpenSSL 配置文件位置openssl version-a|grepOPENSSLDIR# 通常配置文件在 $OPENSSLDIR/openssl.cnf# 在配置文件中查找 [CA_default] 段落下的 cafile 或 cadir 选项三、总结与最佳实践
| 任务 | RHEL/CentOS 系列 | Ubuntu/Debian 系列 |
|---|---|---|
| 放置自定义 CA 证书 | /etc/pki/ca-trust/source/anchors/ | /usr/local/share/ca-certificates/ |
| 更新信任库命令 | sudo update-ca-trust | sudo update-ca-certificates |
| 系统信任库主目录 | /etc/pki/ca-trust/extracted/ | /etc/ssl/certs/ |
| 常用聚合文件 | /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem | /etc/ssl/certs/ca-certificates.crt |
重要注意事项:
- 容器化环境: 在 Docker 或 Podman 容器中,容器拥有自己独立的文件系统。您必须将宿主机的信任库挂载到容器内,或者在构建镜像时就将 CA 证书加入其中。
- Java 应用: Java 有自己的信任库 (
cacerts),通常位于$JAVA_HOME/lib/security/cacerts。即使系统信任了 CA,Java 应用也可能不信任。需要使用keytool命令单独导入。 - 浏览器: Firefox 和 Chrome/Chromium 通常有自己独立的信任库,不会完全遵循系统设置。对于内部网站,可能需要在浏览器中手动导入 CA 证书。