我试图从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
的问题?
答案 0 :(得分:13)
这是一个快速的解决方案:
docker.squadwars.org的示例:
{
"insecure-registries" : ["docker.squadwars.org:443"]
}
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
答案 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)
在浏览器中转到存储库的URL。您可能必须接受所有安全提示。
点击(在Chrome上)地址栏上的挂锁,然后点击“证书”。
单击并按住证书的纸形图标,然后将其拖到您喜欢的文件夹或桌面上。
打开终端(确保将最后一个参数替换为文件的位置):
{services}
| .services |= map_values(select(has("version")) | {version} )
重新启动您的Docker引擎。
答案 5 :(得分:1)
对于使用CentOS 7的任何人,这对我来说都是有效的:
sudo cp -p abc.crt /etc/pki/ca-trust/source
sudo update-ca-trust extract
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 正常工作。