引言
首先如何搭建harbor,查看官网搭建教程:Harbor 文档 | Harbor 安装与配置 – Harbor 镜像仓库
在使用 Docker 构建私有镜像仓库(如 Harbor)时,一个最常见、也最令人头疼的问题就是连接错误:x509: certificate signed by unknown authority,这是Docker不信任我们自签私有证书。
tls: failed to verify certificate: x509: certificate signed by unknown authority
x509 错误是 TLS 握手失败的信号。客户端需要一个完整的信任路径来验证服务器的身份。
- 在 Harbor 自签名场景中,证书链非常短:
- 根证书(Root CA): 由你创建的自签名 CA,是信任的起点。
- 服务器证书(Server Certificate):你的 Harbor 服务使用的最终证书,它是由上面的根 CA 签发的。
- 正常情况下,客户端会沿着这条链条一层层往上验证,直到找到它本地信任的根 CA。
2. “自签名”的困境与信任断裂 当使用自签名证书时,问题就来了:
- 客户端(例如 Docker Daemon)收到 Harbor 服务器的证书。
- 客户端检查签发者,发现是你的私有根 CA。
- 客户端去本地的信任库查找这个私有根 CA 的副本。
- 信任断裂! 全新的客户端默认不认识你这个私有的 CA,本地信任库是空的。
- 由于无法验证根证书的合法性,客户端就会报告 x509: certificate signed by unknown authority 错误。
3. “合并证书链”的原理 “合并证书链”通常指的是在服务器端配置时,将完整的证书路径(服务器证书 + 根 CA 证书)打包提供给客户端。 原理: 当客户端连接时,Harbor 服务器会主动发送一个包含两部分的证书包: [服务器证书内容] + [根 CA 证书内容] 这确保了客户端在本地就能获得完整的验证所需信息。即使没有中间证书,这个合并包也提供了完整的信任路径,但客户端本地仍需安装根 CA 证书作为“锚点”来确认这个包是可信的。
主机配置
主机(服务器端)需要配置合并的证书链。这是为了确保服务器在 TLS 握手时能主动提供完整的证书路径,避免客户端需要猜测或查找缺失的中间证书。
1.在配置 Harbor 时,要配置合并证书链,指令如下:
#sudo cat <服务器证书文件> <根CA证书文件> > <合并后的输出文件>
sudo cat /data/certserver.crt /tmp/my_root_ca.crt > /data/cert/combined.crt
2.更改harbor.yml文件
https:
port: YOUR_HTTPS_PORT
certificate: /data/cert/combined.crt
#使用里面你所命令的.key文件
private_key: /data/cert/.key
客服端配置
客户端验证服务器证书链时,必须在其本地信任库中预置根CA证书作为信任锚点。即使服务器发送了完整的证书链,也只需在客户端安装根CA证书即可完成验证,无需合并证书链文件。
基于Linux 客户端:
# 将 CA 证书复制到系统信任目录
sudo cp /home/user/ca.crt /usr/local/share/ca-certificates/harbor_ca.crt
# 更新系统的 CA 证书库,使新添加的证书生效
sudo update-ca-certificates
# 创建 Docker 存放特定仓库证书的目录
sudo mkdir -p /etc/docker/certs.d/your_ip:port/
# 将 CA 证书复制到该目录,文件名必须是 ca.crt
sudo cp /home/user/ca.crt /etc/docker/certs.d/your_ip:port/ca.crt
# 确保文件权限正确,Docker 可以读取
sudo chmod 644 /etc/docker/certs.d/your_ip:port/ca.crt
# 完成后,记得重启 Docker 服务以应用更改:
sudo systemctl restart docker
我使用的用ip地址充当的命令,也可以用域名 如果登录还报错记得加个sudo试试




