直接说结论:容器内应用代码或命令行 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 包,直接复制证书并更新即可:
COPY ca.crt /usr/local/share/ca-certificates/\nRUN update-ca-certificates2. 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 服务。
2. 忘记更新证书库
仅把证书放到 /usr/local/share/ca-certificates/ 而不执行 update-ca-certificates,证书不会被加载到信任链中。
3. 目录路径不匹配
Docker 守护进程配置证书时,目录名必须严格匹配 registry 域名和端口,漏掉端口号会导致配置不生效。
4. 证书文件格式
确保使用的是 PEM 格式的公钥证书。部分程序对 .crt 和 .pem 后缀敏感,若遇兼容性问题可尝试转换格式或修改后缀。