在Windows上使用Docker(Boot2Docker)时出现“certificate signed by unknown authority”错误

39

我正在Windows上运行Docker(boot2docker + Oracle Virtual Box)。在我的公司环境中,他们修改证书以使CAs成为公司的自签名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中,我该如何解决这个问题?

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 Quickstart终端中运行openssl.exe[1]命令。

    openssl x509 -inform der -in certificate.cer -out certificate.pem
    
  3. 一旦您拥有.pem文件,您将希望将它们复制到您的Docker机器可以访问的位置。通常对于MS Windows,您将自动挂载在docker机器内部的主机机器的/c/Users目录。我在\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

6. 通过在机器内部使用重新启动命令或在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


1
除了上述步骤外,我还需要从“https://registry-1.docker.io/v2/”下载证书,将其转换为*.pem格式并复制到“/etc/docker/certs.d”中,然后才能使其正常工作!但是这些步骤对我找出问题非常有帮助。 - Marco
如果您想更轻松地粘贴这些命令,请在MINGW64中启用“QuickEdit Mode”(右键单击标题栏>选项> QuickEdit Mode)。 https://dev59.com/u2Qo5IYBdhLWcg3wDbsJ#16363972 - yohosuff
+1 我想要补充的是,你可以查看位于 /var/log 目录下的日志文件,其中 bootlocal.logboot2docker.logdocker.log 提供了很好的细节信息,帮助你进行故障排除。 - Jaywalker
这对我来说非常有效,之前我无法执行“docker pull selenium/hub”,现在我可以做所有这些好事了。我有ZScaler证书。 - Junaid Khan

6
用Firefox浏览器访问以下网址:https://auth.docker.io/token?scope=repository%3Alibrary%2Fhello-world%3Apull&service=registry.docker.io,点击查看证书详情并将其提取为crt格式的文件。
将该文件复制到虚拟机中存储crt文件的操作系统所在位置:
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,然后它应该能正常工作。

Ubuntu的解决方案非常好用。我被这个问题困扰了一整天。非常感谢。 - Karthick Jayaraman

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接