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

cld4siwp  于 2023-08-03  发布在  Docker
关注(0)|答案(6)|浏览(429)

我正在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)如果没有,我该如何解决这个问题?

yptwkmov

yptwkmov1#

该任务本身并不特定于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

字符串

h22fl7wq

h22fl7wq2#

为了简化/标准化所有容器构建,我们现在将证书托管在中央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

5hcedyr0

5hcedyr03#

同样值得注意的是,这肯定需要使用.crt扩展名。我最初尝试使用.pem证书文件(我认为它们是可以互换的,所以其他人也可以),这个文件没有通过update-ca-certificates链接。

cnjp1d6j

cnjp1d6j4#

安装ca-certificates时,将cert_file_name.crt文件定位到与Dockerfile相同的目录中。

# 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中的证书。

kxe2p93d

kxe2p93d5#

另一个选择是使用OpenSSL。将domain_name替换为可以检索CA的URL

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

字符串

edqdpe6u

edqdpe6u6#

sudo apt -y install ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/debian/gpg| sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg apt update
echo“deb [arch=$(dpkg --print-architecture)signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs)stable”|sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt -y install docker-ce docker-ce-cli containerd.io
sudo systemctl enable --now docker
Dockefile:
从nginx:latest COPY index.html/usr/share/nginx/html/index.html
sudo docker build -t mywebapp .
sudo docker run -d -p 80:80 mywebapp

相关问题