这个坑值得记一笔。腾讯云 2 核 4G 的 Debian 12 装 Docker 24.0,Go 服务在容器里调 https 接口报 x509: certificate signed by unknown authority,用 curl 试报 SSL certificate problem: unable to get local issuer certificate,宿主机访问同一个地址却完全正常。
刚开始盯着「容器的 /etc/ssl/certs 被只读挂载覆盖,系统更新不了证书」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。基础镜像用的是 scratch 或 alpine 精简版,没有装 ca-certificates 包;公司内网用自签 CA,根证书没有注入容器的信任目录;出口代理做了 TLS 中间人,容器不认代理自己的根证书。
先确认容器里有没有根证书目录
docker run --rm --entrypoint ls app:v2 /etc/ssl/certs | head
再往下在 Dockerfile 里装上证书包并刷新
RUN apk add --no-cache ca-certificates && update-ca-certificates
内网自签 CA 用挂载方式注入
docker run -v /etc/pki/ca-trust/source/anchors/corp.crt:/usr/local/share/ca-certificates/corp.crt app:v2
进容器更新信任链再验证一次
docker exec -it app update-ca-certificates && curl -I https://api.corp.local
怎么算真的好了,看的是同一批现象。curl 返回 200 且不再提示证书错误,Go 服务日志里没有 x509 unknown authority,重启容器后依然正常。
这里还有个坑。把 CA 打进镜像会在证书轮换时留下旧根,内网根证书更适合用 Secret 或配置中心挂载,别写死在 Dockerfile。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
