" docker pull"证书由未知权威签署

时间:2018-06-08 20:58:00

标签: docker ssl curl

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

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

我试过&#34; curl&#34;并得到类似的错误消息:

 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是否使用与curl不同的ca-cert位置?在这种情况下,如何解决docker pull的问题?

9 个答案:

答案 0 :(得分:13)

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

  • 编辑或创建文件/etc/docker/daemon.json并添加不安全的注册表:

docker.squadwars.org的示例:

{
    "insecure-registries" : ["docker.squadwars.org:443"]
}
  • 重新启动docker daemon
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

答案 1 :(得分:4)

  • 首先创建一个文件-/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
    

无需重启即可工作

OR

将证书导入到系统

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

    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 /

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

    sudo update-ca-certificates
    
  • 重新启动docker!

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:3)

对于我来说,该错误是由于“ docker login”命令引起的。

我为ubuntu找到的解决方案:

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

之后:

<form id='form' method='post' action='/'>
    <label for='img1'>
        <input id='img1' type='file' style='display: none;' />
        <img id='img1_preview' src='' />
    </label>

    <input type='submit' value='Update' />
</form>

答案 4 :(得分:2)

对于MacOS Docker Desktop用户:

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

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

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

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

{services}
| .services |= map_values(select(has("version")) | {version} )

重新启动您的Docker引擎。

答案 5 :(得分:1)

对于使用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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

对我来说,我最终这样做是为了使其正常工作:

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 :(得分:0)

就我而言,我在 KIND 容器中遇到了同样的问题。 Curl 在那里不起作用。

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 正常工作。