【问题标题】:"docker pull" certificate signed by unknown authority未知权威签署的“docker pull”证书
【发布时间】:2023-03-12 05:47:02
【问题描述】:

我试图从 docker 注册表中提取 docker 映像,但遇到了以下问题:

$ docker pull <docker registry>/<image name>/<tag> 
Error response from daemon: Get <docker registry>/v1/_ping: x509: certificate signed by unknown authority

我尝试使用“curl”并收到类似的错误消息:

 curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.

于是我下载了 CA 证书并使用以下命令导入服务器(RedHat Linux 7):

cp root_cert.cer /etc/pki/ca-trust/source/anchors/
update-ca-trust

导入根证书后,我可以看到curl 工作正常,因为它不会抱怨证书错误,但是如果我使用docker pull 我仍然有同样的问题。 docker 使用的 ca-cert 位置是否与 curl 不同?在这种情况下如何解决docker pull 的问题?

【问题讨论】:

  • 这里的答案没有解决我的问题,官方文档为我提供了答案 - docs.docker.com/registry/insecure。对我来说,Red Hat 和 Ubuntu 的证书路径和更新命令是不同的。
  • @LostNomad311 谢谢,文档还帮我解决了我的问题

标签: docker ssl curl


【解决方案1】:

您可能需要重新启动 docker 服务以使其检测操作系统证书的更改。

Docker 确实有一个额外的位置,您可以使用它来信任单个注册表服务器 CA。您可以将 CA 证书放在 /etc/docker/certs.d/&lt;docker registry&gt;/ca.crt 中。如果您在图像标签中指定端口号,请包括端口号,例如在 Linux 中。

/etc/docker/certs.d/my-registry.example.com:5000/ca.crt

或在 Windows 10 中:

C:\ProgramData\docker\certs.d\ca.crt

【讨论】:

  • 谢谢! service docker restart 修复了我更改后的问题!另一个注意事项很有用,因为我可以信任特定的 docker 注册表而不会影响其他应用程序。
  • 注意:在 Ubuntu 上使用 snap 时正确的路径是 /var/snap/docker/~current/etc/docker/certs.d
  • 完成上述步骤后,我摆脱了x509: certificate signed by unknown authority,但随后出现401 Unauthorized 错误。为了解决我需要docker login &lt;docker registry&gt;
【解决方案2】:
  • 首先创建一个文件-/etc/docker/daemon.json

  • 比运行以下添加证书

      openssl s_client -showcerts -connect [registry_address]:[registry_port] < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/docker/certs.d/[registry_address]/ca.crt
    

无需重启即可工作

将证书导入到系统中

  • 将证书保存到文件中,就像上面的命令一样(端口很重要,不需要协议)

     openssl s_client -showcerts -connect [registry_address]:[registry_port] < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ca.crt
    
  • 复制到 /usr/local/share/ca-certificates/

     sudo cp ca.crt /usr/local/share/ca-certificates/
    
  • 运行 update-ca-certificates

     sudo update-ca-certificates
    
  • 重启docker!

【讨论】:

  • XXX:创建空的 /etc/docker/daemon.json 并使用 systemctl restart docker 重新启动 docker 导致我的 docker 守护进程死亡。我必须删除创建的文件才能再次运行它。
  • 在我的情况下,我还必须在 /etc/docker/daemon.json 中包含 {"insecure-registries":["&lt;registry_address&gt;:&lt;registry_port&gt;"]} 才能使其工作。
  • 谢谢它就像一个魅力,但我需要用 sudo 做副本
  • 注意:如果你使用 snap 那么正确的路径是:/var/snap/docker/~current/etc/docker/certs.d
【解决方案3】:

这是一个快速的解决方案:

  • 编辑或创建文件/etc/docker/daemon.json并添加insecure-registries

docker.squadwars.org 的示例:

{
    "insecure-registries" : ["docker.squadwars.org:443"]
}
  • 重启 docker 守护进程
systemctl restart docker
  • 创建与主机同名的目录。

docker.squadwars.org 的示例:

mkdir -p /etc/docker/certs.d/docker.squadwars.org
  • 获取证书并将其保存到创建的目录中。
ex +’/BEGIN CERTIFICATE/,/END CERTIFICATE/p’ <(echo | openssl s_client -showcerts -connect docker.squadwars.org:443) -scq > /etc/docker/certs.d/docker.squadwars.org/docker_registry.crt

【讨论】:

    【解决方案4】:

    对于 MacOS Docker 桌面用户:

    在浏览器中转到您存储库的 URL。您可能必须接受所有安全提示。

    点击地址栏上的挂锁?,然后点击“证书”(在 Chrome 上)或“显示证书”(在 Safari 上)。

    单击并按住证书的大纸图标并将其拖到您喜欢的文件夹或桌面上。

    打开您的终端(确保将最后一个参数替换为文件的位置):

    security add-trusted-cert -d -r trustRoot -k ~/Library/Keychains/login.keychain-db ~/<<<somefolder>>>/<<<yourserver.cer>>>
    

    重启你的 docker 引擎。

    【讨论】:

      【解决方案5】:

      对于我来说,错误是在“docker login”命令上。

      我为我的 ubuntu 找到的解决方案:

      我通过 firefox 下载了 crt 文件(url 地址栏中的锁定图标)并保存:~/mydomain:1234.crt

      之后:

      cp ~/mydomain:1234.crt /usr/local/share/ca-certificates/
      update-ca-certificates
      service docker restart
      

      【讨论】:

        【解决方案6】:

        对于任何使用 CentOS 7 的人来说,这对我有用:

        • 获得必要的证书(例如从您的公司获得)
        • 将证书复制到 ca-trust 位置:
        sudo cp -p abc.crt /etc/pki/ca-trust/source
        
        • 更新证书:
        sudo update-ca-trust extract
        
        • 重新加载守护进程并重启 docker:
        sudo systemctl daemon-reload
        sudo systemctl restart docker
        

        【讨论】:

        • 感谢您的评论;我已经修正了错字:)
        【解决方案7】:

        对我来说,我最终这样做是为了让它发挥作用:

        sudo cp -p abc.crt /etc/pki/ca-trust/source/anchors
        sudo update-ca-trust
        sudo update-ca-trust extract
        sudo systemctl daemon-reload
        sudo systemctl restart docker
        

        【讨论】:

          【解决方案8】:

          默认情况下,docker 会在 Centos:/etc/sysconfig/docker 中保存一个本地证书存储。 在组织中,服务器通常预装了它自己的根证书。 所以如果你使用组织颁发的证书,docker 将无法找到组织的 Root Cert。当它指的是其本地商店时。 因此,您可以在 /etc/sysconfig/docker 中删除对其本地存储的引用,也可以删除它的本地证书存储(Centos:/etc/docker/certs.d)。 进行更改后重新启动 docker 服务将解决此问题。

          【讨论】:

            【解决方案9】:

            在我的情况下,我在 KIND 容器中遇到了同样的问题。卷曲在那里不起作用。

            curl https://google.com
            curl: (60) SSL certificate problem: unable to get local issuer certificate
            More details here: https://curl.haxx.se/docs/sslcerts.html
            
            curl failed to verify the legitimacy of the server and therefore could not
            establish a secure connection to it. To learn more about this situation and
            how to fix it, please visit the web page mentioned above.
                
            

            并且 update-ca-certificate 命令对我不起作用。 我必须将 CA 证书附加到 /etc/ssl/certs/ca-certificates.crt 文件:

            cat /ca_cert.pem >>  /etc/ssl/certs/ca-certificates.crt
            

            然后 curl 正常工作。

            【讨论】:

              【解决方案10】:

              在不重启 docker 的情况下更新 ca,并使用 root ca.cert,将 registry.clickpaas.tech 替换为您的域:

              sudo yum -y update ca-certificates;
              sudo mkdir -p /etc/docker/certs.d/registry.clickpaas.tech/;
              sudo cp /etc/ssl/certs/ca-bundle.crt /etc/docker/certs.d/registry.clickpaas.tech/;
              

              【讨论】:

                【解决方案11】:

                没有看到任何答案中提到这一点。这是为每个特定域设置证书的官方 docker 文档。这与最被接受的答案一致。 https://docs.docker.com/engine/security/certificates/

                路径:

                • Linux:/etc/docker/certs.d/[domain of relevent cert]/[cert].crt
                • 窗口:C:/ProgramData/Docker/certs.d/[domain of relevent cert]/[cert].crt


                如果您使用的是 WSL 或 WSL2,您将把证书放在 windows 位置。

                我遇到的一个关键问题是证书的扩展对docker很重要。我无法使用 .cer ssl 证书解决问题,但使用 .crt

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2018-04-22
                  • 1970-01-01
                  • 2019-11-16
                  • 2016-08-24
                  • 2018-07-13
                  • 2019-04-12
                  • 2023-03-17
                  • 1970-01-01
                  相关资源
                  最近更新 更多