Docker 容器内 Curl 访问 HTTPS 报错自签名证书怎么配置

文章导读
直接说结论:容器内应用代码或命令行 curl 报错,是因为容器操作系统不信任该自签名 CA,需将证书导入容器信任库;若是 docker pull 报错,则需配置宿主机 Docker 守护进程。两者处理层面不同,本文重点解决容器内 curl 访问问题。
📋 目录
  1. 第一步:获取自签名根证书
  2. 第二步:容器内配置信任
  3. 第三步:验证是否生效
  4. 常见坑与场景区分
A A

直接说结论:容器内应用代码或命令行 curl 报错,是因为容器操作系统不信任该自签名 CA,需将证书导入容器信任库;若是 docker pull 报错,则需配置宿主机 Docker 守护进程。两者处理层面不同,本文重点解决容器内 curl 访问问题。

核心结论:容器内 curl 报错 unknown authority,需将自签名根证书导入容器系统信任库。

  • 先确认:区分是容器内应用请求报错,还是宿主机 Docker 拉取镜像报错。
  • 优先做:生产环境建议使用受信 CA 证书,测试环境可将根证书挂载至容器并更新信任链。
  • 再验证:使用 curl -v 命令检查 SSL 握手是否成功,确认不再出现 certificate verify failed。

第一步:获取自签名根证书

在配置前,需先从服务端获取正确的根证书文件(.crt 或 .pem 格式)。若无法直接获取文件,可通过 OpenSSL 命令从服务端提取:

openssl s_client -connect your-domain.com:443 -showcerts </dev/null 2>/dev/null | sed -n '/---`--BEGIN` CERTIFICATE-----/,/---`--END` CERTIFICATE-----/p' > ca.crt

确保证书匹配访问地址,域名需出现在证书的 Subject Alternative Name (SAN) 中。

第二步:容器内配置信任

将证书文件挂载进容器,并根据容器基础镜像类型执行更新命令。建议在 Dockerfile 中固化此步骤。

1. Debian/Ubuntu 系容器

此类镜像通常预装 ca-certificates 包,直接复制证书并更新即可:

Docker 容器内 Curl 访问 HTTPS 报错自签名证书怎么配置
COPY ca.crt /usr/local/share/ca-certificates/\nRUN update-ca-certificates

2. Alpine 系容器(重点注意)

Alpine 最小化镜像默认不包含更新命令,必须先安装 ca-certificates 包,否则 update-ca-certificates 会报错命令不存在:

RUN apk add `--no-cache` ca-certificates \nCOPY ca.crt /usr/local/share/ca-certificates/\nRUN update-ca-certificates

若使用 docker run 临时测试,可挂载证书后进入容器手动执行上述命令。

第三步:验证是否生效

进入容器内部,使用 verbose 模式测试 HTTPS 访问:

curl -v https://your-domain.com

观察输出中是否出现 SSL 握手成功信息,且没有 certificate verify failed 字样。若仍报错,检查证书路径是否正确及是否执行了更新命令。

常见坑与场景区分

1. 混淆配置层面

容器内 curl 报错与 docker pull 报错是两回事。在容器内配置证书无法解决 docker pull 报错。若是 docker pull 或 docker login 报错,需将证书放到宿主机 /etc/docker/certs.d/域名:端口/ca.crt,并重启 Docker 服务。

Docker 容器内 Curl 访问 HTTPS 报错自签名证书怎么配置

2. 忘记更新证书库

仅把证书放到 /usr/local/share/ca-certificates/ 而不执行 update-ca-certificates,证书不会被加载到信任链中。

3. 目录路径不匹配

Docker 守护进程配置证书时,目录名必须严格匹配 registry 域名和端口,漏掉端口号会导致配置不生效。

4. 证书文件格式

确保使用的是 PEM 格式的公钥证书。部分程序对 .crt 和 .pem 后缀敏感,若遇兼容性问题可尝试转换格式或修改后缀。