解决docker的tls(ssl)证书过期问题
问题现象:
[root@localhost ~]# docker image pull xxx.com.cn/centos7
using default tag: latest
error response from daemon: get https://xxx.com.cn/v1/_ping: x509: certificate has expired or is not yet valid
可能的原因分析:
linux使用查看date查看当前时间,与证书的有效时间作比对,得出具体的原因,可能为以下二种之一:
1.本机的时间不对;
2.registry的证书确实已过期;
解决方法:
1.本机的时间不对;
修改本机时间即可
2.registry的证书确实已过期;
对 registry 创建 ssl 安全例外,放弃对 registry 服务器证书合法性校验,但是具有安全风险.
insecure registries 使能后, docker 将以以下步骤尝试https连接:
首先尝试使用https.
如果 https 连接可达但是证书不可用, 忽略证书错误;
如果 https 连接不可用, 使用 http.
centos 在 /etc/docker/ 目录下创建daemon的配置文件 daemon.json ,将你的目标 registry 所处的 ip 地址段或者具体的服务域名端口号写入 json 文件,
举个例子,笔者的服务器所在网段为10.0.0.0/8.那么内容如下:
也可以使用域名加端口号,示例如下:
windows 则修改文件 c:\programdata\docker\config\daemon.json ,格式与linux操作的一样.
重启docker服务.
查看是否生效,注意 insecure registries 字段.
如何查看服务器证书有效期
以火狐浏览器为例
补充:docker私有仓库更换过期的自签证书
更换docker registry证书
拉取镜像时报错如下:
查询/etc/docker/certs下的证书是否已过期
显然,该自签证书在2020年3月31号已过期。
重新自签新证书
创建~/certs文件夹存放key和密钥
生成key
生密钥文件
填写相关信息
至此,证书自签完成。
将该证书添加到docker根证书中,重启docker
注:由于是自签名证书,默认是不受docker信任的,故而需要将证书添加到docker的根证书中,docker在centos 7/ubuntu 18中,证书存放路径是/etc/docker/certs.d/域名:
添加证书到docker根证书中
重启docker
替换docker registry容器中的过期证书
查看registry容器id
根据id查看rigstry的挂载路径
将刚刚新生成的证书cp到/root/certs:/certs目录下
重启registry容器
至此,自签证书更新完毕!
测试
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。