1 概述:
1.1 tls客户端对服务端进行校验
校验一半至少包含2层,一层是检查服务端证书中的COMMON NAME字段以及SAN字段是否包含了请求中指定的域名或者IP,另外一层是检查服务端证书是不是被客户端信任的CA所签发。一个常见的情景是docker client尝试从镜像服务(暴露https端口)中拉取镜像,会从上述2个层次做检查,如果有一个检查不通过则无法拉取镜像。
2 遇见自签证书的https registry解决方案之一:
将registry的CA证书ca.crt复制到本地。
# 如果客户端是centos系统
# 1)安装工具包
yum install -y ca-certificates
# 2)复制ca.crt
/bin/cp -f ca.crt /etc/pki/ca-trust/source/anchors/
# 3)更新被信任的CA证书
update-ca-trust
# 4)重启本地dockerd(此步骤是必须的,否则依然报错x509: certificate signed by unknown authority)
systemctl daemon-reload
systemctl restart docker
# 如果客户端是ubuntu系统
# 1)安装工具包
apt-get install -y ca-certificates
# 2)复制ca.crt
/bin/cp ca.crt /usr/local/share/ca-certificates/
# 3)更新被信任的CA证书
update-ca-certificates
# 4)重启本地dockerd(此步骤是必须的,否则依然报错x509: certificate signed by unknown authority)
systemctl daemon-reload
systemctl restart docker
3 小结:
期望docker client忽略检查tls握手中的CA校验,可以在操作系统层面解决,例如公司内部的https服务都使用同一个CA证书,将证书分发到每台机器上并执行相关命令,即可实现机器上的所有进程都信任该CA,当然也包括docker client、curl等。