我正在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)如果没有,我该如何解决这个问题?
6条答案
按热度按时间yptwkmov1#
该任务本身并不特定于Docker,因为您也需要在普通系统上添加该CA。在askubuntu community上有一个关于如何做到这一点的答案。
因此,在Dockerfile中,您需要执行以下操作(如果您使用root以外的用户运行容器,请不要忘记chmod):
字符串
h22fl7wq2#
为了简化/标准化所有容器构建,我们现在将证书托管在中央HTTPS服务器上,并将它们构建到我们的容器中,如下所示:
字符串
基于Alpine的容器没有立即可用的工具,因此需要更多的工作来实现相同的功能:
型
如果您还想更新Java信任库(与任何计算机上的相同):
型
5hcedyr03#
同样值得注意的是,这肯定需要使用.crt扩展名。我最初尝试使用.pem证书文件(我认为它们是可以互换的,所以其他人也可以),这个文件没有通过
update-ca-certificates
链接。cnjp1d6j4#
安装
ca-certificates
时,将cert_file_name.crt
文件定位到与Dockerfile相同的目录中。字符串
这将更新Dockerfile中的证书。
kxe2p93d5#
另一个选择是使用
OpenSSL
。将domain_name
替换为可以检索CA的URL字符串
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