【问题标题】:Docker on Windows (Boot2Docker) - certificate signed by unknown authority errorWindows 上的 Docker (Boot2Docker) - 证书由未知权限错误签名
【发布时间】:2015-07-03 11:12:32
【问题描述】:

我在 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


    【解决方案1】:

    这个普遍问题已经困扰我几个月了。我在尝试让本地虚拟机获取 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 格式,除非您另存为 duch。我发现最简单的方法是在 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
      
    6. 通过使用机器内的 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

    【讨论】:

    • 除上述步骤外,我还得从"https://registry-1.docker.io/v2/"下载证书,转换为*.pem并复制到/etc/docker/certs.d,才成功!但是这些步骤帮助我解决了很多问题。
    • 如果您想更轻松地粘贴这些命令,请在 MINGW64 中启用“快速编辑模式”(右键单击标题栏 > 选项 > 快速编辑模式)。 stackoverflow.com/a/16363972/1455558
    • +1 我想补充的是,您可以查看 /var/log 中的日志文件,如 bootlocal.logboot2docker.logdocker.log帮助您排除故障的场景。
    • 这对我来说就像一个魅力,毕竟我不能做“docker pull selenium/hub”,我现在可以做所有这些好事。我有 ZScaler 证书。
    【解决方案2】:

    一种方法 使用 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,它应该可以工作了

    【讨论】:

    • Ubuntu 解决方案就像魅力一样。被这个问题困扰了一整天。非常感谢
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      • 2023-03-04
      • 2019-10-01
      • 1970-01-01
      • 2021-01-29
      • 2019-11-16
      相关资源
      最近更新 更多