基于SAN证书docker registry构建问题记录

项目场景:

基于Kylin v10构建docker registry遇到问题记录,仅供参考

docker升级前的版本信息:
在这里插入图片描述
升级后docker和go版本信息如下:
在这里插入图片描述


问题描述

由于硬件平台原因,需要升级go和docker,docker版本从18.09.7升级到20.10.9。
升级完成后,进行云平台部署,在云平台部署过程中fluentd container报错,通过单独docker pull下载镜像过程中报相同的错误,如下:
Error response from daemon: Get “https://registryserver:4000/v2”: X509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0)


原因分析:

老版本docker 18.0.7采用的go为1.10.8,新版本docker 20.10.9采用的go的版本为1.16.8。由于我环境中原先认证方式采用了CommonName方式,但Go 1.15 版本开始废弃 CommonName,因此推荐使用 SAN 证书。所以我需要重新建立证书替换掉原先的认证方式。


解决方案:

根证书以及私钥创建

openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 36500 -key ca-key.pem -sha256 -subj "/CN=registryserver" -out ca.pem
openssl genrsa -out server-key.pem 4096

自行更改根证书CN=,我这采用registryserver(后续基于这个建立docker registryserver仓库),同时在生成 ca-key.pem 时会要求输入密码,后面的密码确认都需要,注意保护好密码。

服务器证书签发

注意DNS:均为签发证书主机名(自签证书),若任意写会出错,请参考问题记录

openssl req -new -sha256 \
    -key server-key.pem \
    -subj "/C=CN/OU=CLOUD/O=NUDT/CN=NUDT" \
    -reqexts SAN \
    -config <(cat /etc/pki/tls/openssl.cnf \
        <(printf "\n[SAN]\nsubjectAltName=DNS:registryserver")) \
    -out server.csr
openssl x509 -req -days 36500 \
    -in server.csr -out server-cert.pem \
    -CA ca.pem -CAkey ca-key.pem -CAcreateserial \
    -extensions SAN \
    -extfile <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:registryserver"))

需要自行修改-subj部分,DNS部分我这直接添加单个主机名。

上述命令中的 /etc/pki/tls/openssl.cnf ,即 openssl 的配置文件路径根据实际系统填写对应路径即可。

查看服务器证书信息

上述命令输入后,该有的文件就有了,可以看看最终的证书情况:

openssl x509 -noout -text -in server-cert.pem

配置registryserver

证书分发

注意:路径为我所运行的环境,大家根据实际情况处理

cp server-cert.pem /etc/docker/certs.d/registryserver:4000/ca.crt
cp server-cert.pem /yhcloud/certs/
cp server-key.pem /yhcloud/certs/
cp ca.pem /yhcloud/certs/

其他节点也需要ca.crt证书,才能正常docker pull registry仓库中的镜像
在其他节点上创建目录/etc/docker/certs.d/registryserver:4000/,将server-cert.pem拷贝成ca.crt
scp server-cert.pem $HOST:/etc/docker/certs.d/registryserver:4000/ca.crt

加载镜像

docker load < registry-2.img

或者从网络上下载registry镜像

启动registryserver

docker run -d --restart=always --name registry -v /yhcloud/certs:/certs -v /data:/var/lib/registry -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server-cert.pem -e REGISTRY_HTTP_TLS_KEY=/certs/server-key.pem -p 4000:443 registry:2

镜像仓库上传下载

docker push ..
docker pull ...

问题记录:

  1. 替换完证书后进行docker pull,遇到如下报错:Error response from daemon: Get “https://registryserver:4000/v2/”: x509: certificate is valid for .kylinos.cn, not registryserver
    解决方案:由于目前我的环境是自建的docker registryserver,而我这边输入DNS处写了
    .kylinos.cn字样与实际不匹配,故重新以主机名registryserver生成证书(未深入研究,个人理解,如有误请指正)
  2. 其他节点docker pull镜像,遇到如下报错:Error response from daemon: Get https://registryserver:4000/v2/: x509: certificate signed by unknown authority
    解决方案:编辑 vim /usr/lib/systemd/system/docker.service,找到ExecStart字段在-H之前加入以下配置: --insecure-registry=registryserver:4000即可解决。
    或者通过分发ca来解决:1、手动拷贝mkdir -p /etc/docker/certs.d/registryserver:4000, scp server-cert.pem $HOST:/etc/docker/certs.d/registryserver:4000/ca.crt;2、kolla-ansible方式:kolla-ansible -i multinode copy-cert

参考方案:

http://i.lckiss.com/?p=7479

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值