Linux 上添加自定义 CA 证书
当使用内部 CA 签发的证书时,需要将 CA 根证书添加到系统信任存储中,否则 curl、wget、openssl 等工具会报证书错误。
假设证书文件为 my-ca.crt(PEM 格式),以下按发行版说明操作方法。
RHEL / CentOS / Fedora
sudo cp my-ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust extract
update-ca-trust 会从 source/anchors/ 和 source/ 目录读取证书,生成统一的信任存储到 /etc/pki/ca-trust/extracted/。
Debian / Ubuntu
sudo cp my-ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
证书文件扩展名必须为 .crt,update-ca-certificates 会将其追加到 /etc/ssl/certs/ca-certificates.crt 证书包中。
Arch Linux
使用 trust 命令(来自 ca-certificates 和 p11-kit):
sudo trust anchor my-ca.crt
证书会被存储为 /etc/ca-certificates/trust-source/my-ca.p11-kit,并自动更新 legacy 目录下的 PEM 文件。
卸载:
sudo trust anchor --remove my-ca.crt
Alpine Linux
sudo cp my-ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
如果尚未安装 ca-certificates 包:
sudo apk add ca-certificates
Docker 容器
Dockerfile 中添加(以 Debian 基础镜像为例):
COPY my-ca.crt /usr/local/share/ca-certificates/
RUN update-ca-certificates
Alpine 镜像:
COPY my-ca.crt /usr/local/share/ca-certificates/
RUN apk add --no-cache ca-certificates && update-ca-certificates
Java 应用
Java 不使用系统证书存储,需要单独导入到 JVM 信任库:
sudo keytool -importcert -alias my-ca \
-file my-ca.crt \
-keystore $JAVA_HOME/lib/security/cacerts \
-storepass changeit \
-noprompt
导入后需重启 Java 应用生效。部分发行版使用 $JAVA_HOME/jre/lib/security/cacerts 路径,以实际安装为准。
单次使用(不修改系统存储)
适用于临时调试或不便修改系统配置的场景:
curl
curl --cacert my-ca.crt https://internal.example.com
wget
wget --ca-certificate=my-ca.crt https://internal.example.com
环境变量(curl / wget / openssl 等读取)
export SSL_CERT_FILE=/path/to/my-ca.crt
export SSL_CERT_DIR=/path/to/certs/
验证
# 检查证书是否在系统信任存储中
# Debian/Ubuntu
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt my-ca.crt
# RHEL/CentOS
openssl verify -CAfile /etc/pki/tls/certs/ca-bundle.crt my-ca.crt
# 查看 Java 信任库中的证书
keytool -list -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit | grep my-ca