Skip to content

在 Docker Alpine 中安装可信根 CA

问题描述

在某些企业网络环境中,可能存在 SSL 中间人防火墙,它会用自己的根证书重新签发 HTTPS 证书。这导致基于 Alpine Linux 的 Docker 镜像在执行 apk add 命令时出现 SSL 证书验证失败的错误:

ERROR: unable to select packages:
  curl (no such package):
    required by: world[curl]

这形成了一个"鸡生蛋,蛋生鸡"的问题:需要先安装 ca-certificates 包来更新证书,但安装这个包本身就需要验证 SSL 证书。

解决方案

方法一:直接追加根证书到证书文件(推荐)

这是最简单且最直接的方法,适用于大多数场景:

dockerfile
FROM alpine:latest

# 将自定义根证书复制到镜像中
COPY my-root-ca.crt /usr/local/share/ca-certificates/my-root-ca.crt

# 直接将证书追加到系统证书文件中
RUN cat /usr/local/share/ca-certificates/my-root-ca.crt >> /etc/ssl/certs/ca-certificates.crt && \
    apk --no-cache add \
        curl

提示

使用这种方法时,请确保证书文件格式正确,通常应为 PEM 格式(包含 -----BEGIN CERTIFICATE----------END CERTIFICATE-----)。

方法二:使用 --no-check-certificate 选项(Alpine 3.18+)

如果使用的是 Alpine 3.18 或更高版本,可以使用 --no-check-certificate 选项绕过证书验证:

dockerfile
FROM alpine:latest

# 使用 --no-check-certificate 选项安装 ca-certificates
RUN apk --no-cache add --no-check-certificate ca-certificates \
    && update-ca-certificates

# 然后正常安装其他包
RUN apk --no-cache add curl

注意

此方法仅适用于 Alpine 3.18 及以上版本,且会暂时禁用 SSL 验证,在安全要求严格的环境中需谨慎使用。

方法三:完整工作流程(处理复杂场景)

针对需要更完整证书管理的场景:

dockerfile
FROM alpine:latest

USER root

# 第一步:手动添加根证书以解决初始信任问题
COPY my-root-ca.crt /root/my-root-ca.crt
RUN cat /root/my-root-ca.crt >> /etc/ssl/certs/ca-certificates.crt

# 第二步:正常安装 ca-certificates 包
RUN apk --no-cache add ca-certificates \
    && rm -rf /var/cache/apk/*

# 第三步:正式添加自定义证书并更新证书存储
COPY my-root-ca.crt /usr/local/share/ca-certificates
RUN update-ca-certificates

# 第四步:安装所需工具
RUN apk --no-cache add curl

详细说明

证书存储位置

  • /etc/ssl/certs/ca-certificates.crt - 系统证书存储文件
  • /usr/local/share/ca-certificates/ - 自定义证书存放目录
  • /etc/ssl/certs/ - 证书符号链接目录

工作原理

  1. 初始信任建立:通过直接追加证书到 ca-certificates.crt 文件建立初始信任
  2. 证书管理工具:安装 ca-certificates 包提供 update-ca-certificates 工具
  3. 正式证书添加:将证书放置到正确位置并使用标准工具更新证书存储

最佳实践

建议

  1. 确保证书文件的扩展名为 .crt 以便被 update-ca-certificates 自动识别
  2. 定期更新和维护自定义根证书
  3. 在生产环境中使用官方或经过验证的证书源
  4. 考虑使用多阶段构建来优化镜像大小和安全性

常见问题排查

如果仍然遇到证书问题,可以尝试以下诊断步骤:

dockerfile
# 调试用 Dockerfile 片段
RUN apk --no-cache add openssl
RUN openssl s_client -connect dl-cdn.alpinelinux.org:443 -showcerts

此命令将显示服务器提供的证书链,帮助诊断证书验证问题。

通过上述方法,您可以在企业网络环境中成功构建基于 Alpine Linux 的 Docker 镜像,同时确保 SSL/TLS 连接的可靠性和安全性。