Machine: 在本地 VM docker 机器上安装 CA 证书的推荐方法

创建于 2015-09-03  ·  34评论  ·  资料来源: docker/machine

通常,公司的根 CA 证书由 IT 安装在开发人员的机器和服务器上(它们不随操作系统一起提供)。 在本地 VM(虚拟机)上使用 docker 机器时,我们是否需要在 VM 上安装公司根 CA 证书才能与公司网络上托管的 docker 注册表通信?

我想知道在本地 VM 上安装 CA 证书的推荐方法是什么? 似乎是这里答案的开始,但没有任何说服力/正确。

如果有中间公司 CA,推荐的方式是什么? 捆绑所有证书?

areidentity

最有用的评论

这需要大量挖掘,解决方案非常简单(但并不明显)。 有几件事需要注意。 答案就在这里- 但是您必须阅读代码部分才能找到替代方法。

基本上,将 CA 信任链的 pem(Base64 编码)版本复制到/var/lib/boot2docker/certs/ 。 您不能使用 ca 捆绑包。 boot2docker 启动脚本将自动在那里获取 pem 文件并将它们添加到 ssl 配置中。 此外,这是一个特殊目录,将在重新启动时保留。

$ docker-machine ssh default 'sudo mkdir /var/lib/boot2docker/certs'
$ docker-machine scp corp-ca.pem default:
$ docker-machine ssh default 'sudo mv corp-ca.pem /var/lib/boot2docker/certs/'
$ docker-machine restart default 

这应该更简单,所以我支持 (#1799)。 此外,我们应该能够指定一个充满 pem 文件的目录,这样添加多个证书(就像在整个信任链中一样)很容易。

所有34条评论

我也想知道这个。 我已经按照程序 (https://docs.docker.com/articles/https/) 创建了一个新的 CA 和证书。 我试过将文件 /var/lib/boot2docker 和 /var/lib/boot2docker/tls 放在 /etc/init.d/docker start 脚本覆盖我生成的证书的问题上。

我对此进行了更多研究,看起来 docker-machine 将使用它生成的证书覆盖主机 .docker/machines/machine/default 中的任何内容。 它还替换 /var/lib/boot2docker 中 boot2docker vm 中的文件。 可以登录和替换 vm 中的文件并更新 /var/lib/boot2docker/profile 但这也在启动时被替换(不确定是什么,但可能是'docker-machine env default')。

@oobles您应该能够使用--tls-ca-cert--tls-cert--tls-key选项来指定现有证书。

使用docker-machine --tls-ca-cert=my_company_ca.pem create --driver virtualbox vm ,命令失败:

Error creating machine: error generating server cert: crypto/tls: private key does not match public key

这里的要点(我猜在大多数公司中)是我不能提供--tls-ca-key选项,因为我不管理公司 CA,所以我不知道私钥。

我在这里错过了什么? 这些选项仅对管理自己的 CA、签署自己的证书的人有用吗?

我只希望我的 docker 客户端(在我的 VM 上)将docker login放到我们的公司注册表中,该注册表显示了由公司 CA 签署的证书。

有什么帮助吗?

同样的问题这里有什么改进吗?

+1。 在我们的组织中也有同样的问题。

我解决这种情况的方式是:
在注册服务器上:

  1. 创建自签名证书作为 docker 文档中的状态。
  2. 创建一个连接密钥和证书文件的 .pem 文件

在 Docker 机器上:

  1. 通过 scp 将 pem 文件复制到您的[email protected] :/home/
  2. 通过 ssh [email protected] (密码:tcuser)将 pem 文件移动到:/var/lib/boot2docker/certs/
  3. 重启 Docker 机器

从 https 连接下载时,我的容器构建达到unable to find valid certification 。 我的公司使用中间 ZScaler CA 根证书 & 还使用 PAC 文件来自动配置代理。

+1 对此。 如果可以重用现有的 CA(证书和密钥)和客户端证书(证书和密钥),那么在使用 docker-machine 将证书部署到 docker 引擎时,真的应该可以重用现有的 TLS 基础设施,例如

  • --tls-server-cert
  • --tls-server-key
docker-machine create -d ... \
  --tls-ca-cert cacert.pem \
  --tls-ca-key cacert.key \
  --tls-client-cert local_user.pem \
  --tls-client-key local_user.key \
  --tls-server-cert server.pem \
  --tls-server-key server.key

Error creating machine: Error running provisioning: error generating server cert: crypto/tls: failed to parse private key对我有用,因为cacert.key受密码保护。

+1

👍 ,因为这对我们来说是一个主要的障碍。 我们的企业 IT 组织将自定义 HTTPS 证书放在从我们公司防火墙内部到公共 Internet 的所有请求上,因此我们甚至无法在无法正确配置这些证书的情况下联系 docker hub 获取容器。

有没有人找到解决这个问题的方法? 我们的企业 IT 执行中间人以替换所有 HTTPS 证书。

当我尝试...
docker-machine --tls-ca-cert root.cer create --driver virtualbox default它抛出以下错误

Error creating machine: Error running provisioning: error generating server cert: crypto/tls: private key does not match public key

我最终在机器创建时跳过了 tls 证书。 一旦创建
机器:

docker-machine scp certfile默认:ca.crt
docker-machine ssh 默认
须藤 mv ~/ca.crt /etc/docker/certs.d/docker.io/ca.crt

那么它应该工作。 您可能必须在 mv 之前 mkdir 子目录
命令。 如有必要,将 docker.io 替换为内部注册主机。

上周四,2016年8月11日,安迪Ruestow [email protected]写道:

有没有人找到解决这个问题的方法? 我们的企业 IT 执行中间人
替换所有 HTTPS 证书。

当我尝试...
docker-machine --tls-ca-cert root.cer create --driver virtualbox 默认
它引发以下错误

创建机器时出错:运行配置时出错:生成错误
服务器证书:crypto/tls:私钥与公钥不匹配


您收到此消息是因为您发表了评论。
直接回复本邮件,在GitHub上查看
https://github.com/docker/machine/issues/1799#issuecomment -239175647,
或静音线程
https://github.com/notifications/unsubscribe-auth/AAJD9p1tfX97V_OW4DgJkzxP86URi-C5ks5qezAsgaJpZM4F3GTM
.

+ 1 GE 正在使用 Zscaler 并进行 MitM cert mangling 并且 docker 现在无法从我们所有的开发人员机器上使用。

+1,现在也试图解决这个问题。

+1,也试图在企业环境中解决这个问题

+1 也是企业环境,代理进行 MitM 证书处理。 需要一种安装证书的方法。

这需要大量挖掘,解决方案非常简单(但并不明显)。 有几件事需要注意。 答案就在这里- 但是您必须阅读代码部分才能找到替代方法。

基本上,将 CA 信任链的 pem(Base64 编码)版本复制到/var/lib/boot2docker/certs/ 。 您不能使用 ca 捆绑包。 boot2docker 启动脚本将自动在那里获取 pem 文件并将它们添加到 ssl 配置中。 此外,这是一个特殊目录,将在重新启动时保留。

$ docker-machine ssh default 'sudo mkdir /var/lib/boot2docker/certs'
$ docker-machine scp corp-ca.pem default:
$ docker-machine ssh default 'sudo mv corp-ca.pem /var/lib/boot2docker/certs/'
$ docker-machine restart default 

这应该更简单,所以我支持 (#1799)。 此外,我们应该能够指定一个充满 pem 文件的目录,这样添加多个证书(就像在整个信任链中一样)很容易。

@rpomeroy非常感谢,我一直在做同样的事情,但不知道需要重新启动 VM,因此正在到处复制证书以使其工作

Docker for Windows 的任何修复

@romeroy谢谢,在我们的 docker 机器中导入公司 root ca 是否足以使我们的注册表可访问? 还是我们还需要把东西放在/etc/docker/certs.d/hostname/

正如该线程前面提到的,boot2docker 下的 Linux 发行版基本上是不可变的,因此将内容放入 /etc/docker/certs 将无法生存。 只有 var/lib/boot2docker/certs 是可变和持久的。 请注意,可能需要使用较新版本的 boot2docker 重新验证所有这些信息。

我正在运行 Windows 7 + VirtualBox (v5.2.6) +Docker Toolbox(Boot2Docker 版本 18.02.-ce)并且遇到了同样的问题。
例如,在尝试运行容器时,我收到以下错误:
码头工人运行 ubuntu /bin/echo 'Hello world'
无法在本地找到图像“ ubuntu:latest
C:\Program Files\Docker Toolboxdocker.exe:来自守护进程的错误响应:获取https://registry-1.docker.io/v2/:x509 :由未知机构签署的证书。
请参阅“C:\Program Files\Docker Toolboxdocker.exe run --help”。

以下解决方案对我有用:

  1. 登录到默认的 docker VM
  2. 下载您的公司根证书
  3. 创建一个新目录:
    须藤 mkdir /var/lib/boot2docker/certs
  4. 将您的公司根证书复制到新创建的文件夹中:
    须藤cp Root-Ca1.crt Root-Ca2.crt /var/lib/boot2docker/certs
  5. 重启默认虚拟机
    现在它正在拉图像:)

@kvvoronina我和你面临同样的问题。 相反,我在 win 8.1 上运行 docker 工具箱
我正在尝试使用您的步骤。 但我使用直接连接(意味着我无法在第 2 步和第 4 步中提供任何公司根证书)。 如何解决这个问题? 谢谢

你好,

谢谢鬼它的工作,我现在可以拉我的形象。
但我无法构建此示例的图像: https :
我得到这个错误:
Step 4/7 : RUN pip install --trusted-host pypi.python.org -r requirements.txt ---> Running in b700eb53b7b2 Collecting Flask (from -r requirements.txt (line 1)) Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAI LED] certificate verify failed (_ssl.c:726)'),)': /simple/flask/
你有什么问题吗?

Ubel,我遇到了同样的问题,我要拉取图像,但是我无法使用 docker 开始演练来构建图像。 你能克服这个问题吗?

@cmenjivar :不,我仍然有同样的问题......

@Ubel :我找到了一个解决方案,在您的 Dockerfile 中,只需添加所有 3 个托管的 python 主机,而不是一个...

RUN pip install --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --trusted-host pypi.org -r requirements.txt

@cmenjivar :感谢您的帮助。 它也对我有用。

现在我需要用 nuget 包 url 尝试同样的事情

有人可以为 Windows 主机和 Windows 容器更新这个吗?

对于它的价值, @romeroy有正确的答案......

如果您使用的是 Windows,请在“Docker 快速入门终端”中发出以下命令,以确保您拥有合适的环境。 “$”是提示,不要粘贴那部分。 在运行以下命令之前,您可能需要发出cd ~/Downloads以访问您的下载文件夹。 您可以为需要添加的每个证书颁发机构(中间或其他)重复两个中间步骤 (corp-ca.pem),只需给它们一个不同的名称。 您也可以使用通配符,例如: corp-*.pem如果您有 corp-ca-root.pem、corp-ca-intermediate.pem 和 corp-issuing-ca.pem。

从上面的@romeroy复制:

$ docker-machine ssh default 'sudo mkdir /var/lib/boot2docker/certs'
$ docker-machine scp corp-ca.pem default:
$ docker-machine ssh default 'sudo mv corp-ca.pem /var/lib/boot2docker/certs/'
$ docker-machine restart default 

尝试使用 --tls-cert、--tls-key 和 --tls-ca-cert 的人使用了不正确的选项。 这些用于 docker 客户端和服务器之间的身份验证。

我想说的唯一一点是 /etc 中的文件系统实际上并不是“不可变的”,它们实际上是“短暂的”(tmpfs),这意味着它们会在每次重新启动时消失。 /var/lib/boot2docker/certs 中的信息将重新填充到 /etc/docker/certs 中的正确位置...

无论如何,如果 docker-machine 能够自动信任主机系统信任的任何证书,那就太好了。

对于那些可能认为它只适用于 boot2docker 设置而不适用于 Windows (Hyper-V) 设置的 Docker 的解决方案的人来说,这个( @rpomeroy的解决方案)似乎也很完美。 我一定已经阅读了这个线程六次并拒绝了它,因为它不是特定于 Docker for Windows 环境的。

@rpomeroy的解决方案适用于 boot2docker 和 Docker for Windows。

我将我的公司 .cer 证书上传到我的 docker 容器的 /etc/pki/ca-trust/source/anchors 目录中,并输入以下命令。

更新-ca-信任启用
更新-ca-信任

完成上述步骤后,我可以从 curl 获得所需的输出

只是插话..

看起来在您的容器上添加这两个安装似乎适用于大多数配置:

    volumes:
      - /etc/ssl/certs:/etc/ssl/certs
      - /usr/share/ca-certificates:/usr/share/ca-certificates

Windows 是另一回事。如果可能,我会避免使用 Windows Docker 主机。

此页面是否有帮助?
0 / 5 - 0 等级