如何在 docker 图像中添加 CA 根证书?
How do I add a CA root certificate inside a docker image?
我是 运行 ASP.NET Core 1.1 Web API 在 Ubuntu 14.04 上的 Docker 1.13.1 容器中。
当代码尝试从 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) 如果没有,我该如何解决?
任务本身并不特定于 docker,因为您也需要在普通系统上添加该 CA。 askubuntu community 上有关于如何执行此操作的答案。
因此,在 Dockerfile 中,您将执行以下操作(如果您 运行 容器中的用户不是 root,请不要忘记 chmod):
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
还值得注意的是,这肯定需要使用.crt 扩展名。我最初尝试使用 .pem 证书文件(我认为它们是可以互换的,所以其他人也可以),它没有被 update-ca-certificates
.
链接
正在安装 ca-certificates
在与 Dockerfile 相同的目录中找到 cert_file_name.crt
文件。
# Install ca-certificates
# Please locate cert_file_name.crt file in the same directory as Dockerfile.
COPY cert_file_name.crt /usr/share/ca-certificates/
RUN echo cert_file_name.crt >> /etc/ca-certificates.conf
RUN update-ca-certificates
这将更新 Dockerfile 中的证书。
对于 simplify/standardise 所有容器构建,我们现在将我们的证书托管在中央 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
另一种选择是使用 OpenSSL
。将 domain_name
替换为 URL 您可以检索 CA
RUN openssl s_client -connect <domain_name>:443 -showcerts </dev/null 2>/dev/null | sed -e '/-----BEGIN/,/-----END/!d' | tee "/usr/local/share/ca-certificates/ca.crt" >/dev/null && \
update-ca-certificates
我是 运行 ASP.NET Core 1.1 Web API 在 Ubuntu 14.04 上的 Docker 1.13.1 容器中。
当代码尝试从 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) 如果没有,我该如何解决?
任务本身并不特定于 docker,因为您也需要在普通系统上添加该 CA。 askubuntu community 上有关于如何执行此操作的答案。
因此,在 Dockerfile 中,您将执行以下操作(如果您 运行 容器中的用户不是 root,请不要忘记 chmod):
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
还值得注意的是,这肯定需要使用.crt 扩展名。我最初尝试使用 .pem 证书文件(我认为它们是可以互换的,所以其他人也可以),它没有被 update-ca-certificates
.
正在安装 ca-certificates
在与 Dockerfile 相同的目录中找到 cert_file_name.crt
文件。
# Install ca-certificates
# Please locate cert_file_name.crt file in the same directory as Dockerfile.
COPY cert_file_name.crt /usr/share/ca-certificates/
RUN echo cert_file_name.crt >> /etc/ca-certificates.conf
RUN update-ca-certificates
这将更新 Dockerfile 中的证书。
对于 simplify/standardise 所有容器构建,我们现在将我们的证书托管在中央 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
另一种选择是使用 OpenSSL
。将 domain_name
替换为 URL 您可以检索 CA
RUN openssl s_client -connect <domain_name>:443 -showcerts </dev/null 2>/dev/null | sed -e '/-----BEGIN/,/-----END/!d' | tee "/usr/local/share/ca-certificates/ca.crt" >/dev/null && \
update-ca-certificates