Kubernetes中使用自签名证书Minio的Docker Registry出现x509错误
排查点梳理
第一步:定位错误发生的链路节点
首先先明确x509错误是哪一段链路抛出的,避免错配配置:
- 拉取Registry的完整运行日志,确认错误信息中关联的请求目标地址:如果地址是Minio的访问地址,说明是Registry访问Minio时证书校验失败;如果地址是Registry自身的访问地址,说明是上游的dind/客户端访问Registry时校验失败
- 逐层手动验证证书有效性:
- 进入Registry容器内部,执行
curl -v https://<你的Minio访问地址>,查看是否返回证书校验错误 - 进入dind容器内部,执行
curl -v https://<你的Registry访问地址>,查看是否返回证书校验错误 - 到客户端节点,执行
curl -v https://<你推送镜像时用的Registry地址>,查看是否返回证书校验错误
- 进入Registry容器内部,执行
第二步:证书配置问题排查
- 检查自签名证书的SAN(使用者备用名称)字段:Minio的证书SAN必须包含你在Registry中配置的Minio访问地址(支持域名、集群服务名、IP),如果SAN字段没有匹配的地址,哪怕CA已经被系统信任,也会触发证书校验失败
- 确认系统CA证书加载生效:
- 如果容器是Alpine基础镜像,需要先安装
ca-certificates依赖包,再将CA证书放入/usr/local/share/ca-certificates/目录,且证书后缀必须为.crt,最后执行update-ca-certificates才能正常加载 - 执行完更新命令后,可以执行
awk -v cmd='openssl x509 -noout -subject' '/BEGIN/{close(cmd)};{print | cmd}' < /etc/ssl/certs/ca-certificates.crt | grep <你的CA证书主题名>,确认CA证书确实被写入系统根证书库
- 如果容器是Alpine基础镜像,需要先安装
- 确认Docker的certs.d配置正确:
- 路径必须和你访问Registry的地址完全匹配,如果你用的是非443端口,路径必须包含端口,比如Registry访问地址是
registry.mydomain:5000,则证书必须放在/etc/docker/certs.d/registry.mydomain:5000/目录下 - 目录下的CA证书必须命名为
ca.crt,文件权限设置为644,修改完成后必须重启Docker daemon才会生效
- 路径必须和你访问Registry的地址完全匹配,如果你用的是非443端口,路径必须包含端口,比如Registry访问地址是
- Registry访问Minio的证书配置:不需要修改Registry源码,直接在Registry的
config.yml配置文件的storage.s3配置段添加ca: /path/to/minio-ca.crt字段,指定Minio CA证书的路径即可,该配置优先级高于环境变量,适配Registry内置的S3存储客户端
第三步:运行态配置校验
- 检查K8s Deployment的卷挂载配置,确认你放置的CA证书文件确实被正确挂载到运行中的容器对应路径,没有出现路径拼写错误、挂载为空、权限不足的问题
- 如果你是用K8s Service暴露Minio服务,建议Registry用集群内部服务名访问Minio,且Minio证书的SAN需要包含
<Minio服务名>.<命名空间>.svc.cluster.local的集群内部域名,避免走外部链路访问带来的额外校验问题
内容的提问来源于stack exchange,提问作者Hannah Ritter
相关产品推荐
相关产品推荐

