如何在 docker 镜像中添加 CA 根证书?

新手上路,请多包涵

我在 Ubuntu 14.04 上的 Docker 1.13.1 容器中运行 ASP.NET Core 1.1 Web API。

当代码尝试从 HTTPS 服务器检索一些数据时,我收到此证书身份验证错误:

  An error occurred while sending the request. ---> System.Net.Http.CurlException: Peer certificate cannot be authenticated with given CA certificates
   at System.Net.Http.CurlHandler.ThrowIfCURLEError(CURLcode error)
   at System.Net.Http.CurlHandler.MultiAgent.FinishRequest(StrongToWeakReference`1 easyWrapper, CURLcode messageResult)

HTTPS 服务器是内部的,证书由我们的公司 CA 签名,所以我知道我可能需要注册内部 CA。

到目前为止我发现的关于这个错误的所有内容,Docker 都谈到了让 docker 本身运行、连接到 repos 等。我的 Docker 工作正常,Web API 在容器外的 Ubuntu 服务器上运行没有问题。

  1. 我需要在 docker 镜像中添加 CA 根证书吗?

2)如果是这样,我该怎么做?

3)如果没有,我该如何解决这个问题?

原文由 Peter 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

该任务本身并不特定于 docker,因为您也需要在普通系统上添加该 CA。 askubuntu 社区 上有一个关于如何做到这一点的答案。

因此,在 Dockerfile 中,您将执行以下操作(不要忘记 chmod,以防您使用 root 以外的用户运行容器):

 ADD your_ca_root.crt /usr/local/share/ca-certificates/foo.crt
RUN chmod 644 /usr/local/share/ca-certificates/foo.crt && update-ca-certificates

原文由 cebe 发布,翻译遵循 CC BY-SA 4.0 许可协议

为了简化/标准化所有容器构建,我们现在将证书托管在中央 HTTPS 服务器上,并将它们构建到我们的容器中,如下所示:

 # Debian stretch based container
RUN curl -ks 'https://cert.host.server/ssl_certs/EnterpriseRootCA.crt' -o '/usr/local/share/ca-certificates/EnterpriseRootCA.crt'
RUN /usr/sbin/update-ca-certificates

基于 Alpine 的容器没有立即可用的工具,因此需要做更多的工作来实现相同的目标:

 # Alpine based containers
RUN apk update && apk add curl
WORKDIR /usr/local/share/ca-certificates
RUN curl -ks 'https://cert.host.server/ssl_certs/EnterpriseRootCA.crt' -o '/usr/local/share/ca-certificates/EnterpriseRootCA.crt'
RUN /usr/sbin/update-ca-certificates

如果您还想更新您的 Java 信任库(与任何计算机上相同):

 RUN keytool -keystore /usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias EnterpriseRootCA -file EnterpriseRootCA.crt

原文由 Peter 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题