Windows上的Docker(Boot2Docker) - 由未知权限错误签名的证书

cod*_*ent 35 windows virtualbox docker boot2docker

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

Company's CA
    |__
        Company's Intermediate CA
            |__
               Docker Certificate
Run Code Online (Sandbox Code Playgroud)

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

docker run hello-world
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Get https://index.docker.io/v1/repositories/library/hello-world/images: x509: certificate signed by unknown authority
Run Code Online (Sandbox Code Playgroud)

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

小智 75

这个一般性问题一直困扰着我几个月.我在尝试获取本地虚拟机来获取Python包时首先注意到它,所以我已经知道证书会成为一个问题.我为我的虚拟机解决了这个问题,但直到今天才能为Docker找到解决方案.诀窍是将证书添加到Docker的证书库并让它们保持不变.这是通过使用bootlocal.sh每次机器启动时执行的脚本来完成的.

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

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

  2. 将它们保存到已知位置后,除非另存为duch,否则您需要将它们转换为PEM格式.我发现这样做的最简单方法是从Docker Quickstart Terminal中运行openssl.exe [1]命令.

    openssl x509 -inform der -in certificate.cer -out certificate.pem
    
    Run Code Online (Sandbox Code Playgroud)
  3. 获得.pem文件后,您需要将它们复制到Docker计算机可以访问的位置.通常对于MS Windows,您将拥有/ c /主机的用户自动安装在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/
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

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

    #!/bin/sh
    
    mkdir -p /etc/docker/certs.d && cp /var/lib/boot2docker/certs/*.pem /etc/docker/certs.d
    
    Run Code Online (Sandbox Code Playgroud)
  6. 通过使用计算机内的reboot命令或使用Docker终端中的docker-machine命令重新启动计算机:

    docker-machine restart default
    
    Run Code Online (Sandbox Code Playgroud)

现在你应该能够运行'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


And*_*son 6

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

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

中央操作系统

etc/pki/ca-trust/source/anchors/
# Then run
update-ca-trust force-enable
update-ca-trust extract
Run Code Online (Sandbox Code Playgroud)

乌班图

/usr/share/ca-certificates
#Then run
sudo dpkg-reconfigure ca-certificates
Run Code Online (Sandbox Code Playgroud)

重启docker,应该就可以了