Windows 上的 Docker (Boot2Docker) - 证书由未知颁发机构签名错误

问题描述 投票:0回答:3

我在 Windows 上运行 Docker(boot2docker + Oracle Virtual Box)。在我的公司环境中,他们修改证书,使 CA 成为公司的自签名 CA。因此,链条最终是这样的:

Company's CA
    |__
        Company's Intermediate CA
            |__
               Docker Certificate

当我尝试运行任何命令时,例如:

docker run hello-world

我收到此错误:

Get https://index.docker.io/v1/repositories/library/hello-world/images: x509: certificate signed by unknown authority

我找到了这个问题的几个答案,但总是针对 Linux 环境。如何在 Windows 中解决此问题?

windows docker virtualbox boot2docker
3个回答
90
投票

这个普遍问题已经困扰我几个月了。我第一次注意到它是在尝试让本地虚拟机获取 Python 包时,所以我已经知道证书会是一个问题。我为我的虚拟机解决了这个问题,但直到今天才能够为 Docker 找到解决方案。诀窍是将证书添加到 Docker 的证书存储中并让它们持续存在。这是通过使用每次机器启动时执行的

bootlocal.sh
脚本来完成的。

我假设如果您已经找到了 Linux 的答案,那么您已经知道了第一步。为了彻底起见,我将在这里记录它们,因为其他人可能还没有走到这一步。如果您已经通过之前的尝试完成了 #1 和 #2,请从下面的 #3 开始。

  1. 获取一组企业根证书,该证书应安装在您的企业配置的浏览器中。在 Chrome 中,您可以转到“设置”,单击“显示高级设置”,然后向下滚动到“HTTPS/SSL”,您可以在其中选择“管理证书”。我的组织已将它们放入受信任的根证书颁发机构中,并以组织的名字命名。导出每个(我有两个),一次一个。您可以选择 DER 格式 并执行下面的步骤 #2 以转换为 PEM,或者您可以选择 Base-64 编码的 x.509 (.CER) 并将扩展名重命名为 .pem 并跳过步骤#2。

  2. 将它们保存到已知位置后,您将需要将它们转换为 PEM 格式,除非您这样保存。我发现执行此操作的最简单方法是从 Docker 快速启动终端中运行 openssl.exe[1] 命令。

    openssl x509 -inform der -in certificate.cer -out certificate.pem
    
  3. 获得 .pem 文件后,您将需要将它们复制到 Docker 计算机有权访问的位置。通常对于 MS Windows,您会将主机的 /c/Users 自动安装在 docker 计算机内。我在

    c:\Users\<my.username>\certs
    中创建了一个目录并将它们复制到那里。

  4. 这一步可能不是绝对必要的,但这就是我所做的,而且有效。您需要将这些证书复制到您的 boot2docker 分区中,该分区是持久的。我正在连接到我的默认计算机,这是您需要在第 5 步中执行的操作。

    MINGW64:$ docker-machine ssh default
    
    docker@default:~$ sudo -s
    root@default:/home/docker# mkdir /var/lib/boot2docker/certs
    root@default:/home/docker# cp /c/Users/my.username/certs/*.pem /var/lib/boot2docker/certs/
    
  5. 现在是时候编写一个 bootlocal.sh 脚本了,该脚本会在每次系统启动时将证书复制到正确的位置。[2]如果您还没有这样做,请按照步骤 4 打开与计算机的 SSH 连接。

    touch /var/lib/boot2docker/bootlocal.sh && chmod +x /var/lib/boot2docker/bootlocal.sh
    vi /var/lib/boot2docker/bootlocal.sh
    

插入以下内容并保存文件:

    #!/bin/sh

    mkdir -p /etc/docker/certs.d && cp /var/lib/boot2docker/certs/*.pem /etc/docker/certs.d
  1. 重新启动机器,可以使用机器内的reboot命令,也可以使用Docker终端的docker-machine命令:

    docker-machine restart default
    

现在您应该能够运行“hello-world”和其他命令。


来源

[1] https://serverfault.com/questions/254627/how-to-convert-a-cer-file-in-pem

[2] https://github.com/boot2docker/boot2docker/issues/347#issuecomment-189112043


6
投票

一种方法 使用 Firefox,转到 url:https://auth.docker.io/token?scope=repository%3Alibrary%2Fhello-world%3Apull&service=registry.docker.io,单击查看证书详细信息并将其提取为 crt .

将文件复制到操作系统存储crt的VM:

CentOS

etc/pki/ca-trust/source/anchors/
# Then run
update-ca-trust force-enable
update-ca-trust extract

Ubuntu

/usr/share/ca-certificates
#Then run
sudo dpkg-reconfigure ca-certificates

重新启动docker,它应该可以工作了


1
投票

导出证书时,您可以选择文件格式为“Base-64编码的x.509(.CER)”,最后将证书扩展名重命名为.pem

© www.soinside.com 2019 - 2024. All rights reserved.