harbor配置自签名证书后docker login失败,90%因证书路径、文件名或域名不匹配:证书须放于/etc/docker/certs.d/域名/下,文件名必须为ca.crt,且域名须与login命令及harbor.yml中hostname完全一致,同时需在/etc/hosts中正确映射域名到ip。

Harbor 配置自签名证书后,客户端 docker login 失败,90% 是证书路径、文件名或域名不匹配导致的,不是 Docker 服务没重启——绝大多数情况根本不需要重启。
证书必须放在 /etc/docker/certs.d/域名/ 目录下
Docker 客户端只认这个固定路径结构,且域名必须和 docker login 命令里用的一致(不能是 IP,不能带端口,不能大小写混用)。
- 如果你用
docker login harbor.example.com,目录就得是/etc/docker/certs.d/harbor.example.com/ - 如果 Harbor 配置的是
www.harbor.mobi,那客户端也必须用这个域名登录,且目录名必须完全一致 - 本地
/etc/hosts必须提前映射好该域名到 Harbor 服务器 IP,否则 DNS 解析失败,连证书校验都进不去
ca.crt 文件名不能改,且必须是根 CA 证书
Docker 硬编码只读 ca.crt,其他名字(如 harbor-ca.crt、root.crt)全被忽略。
- 确认你复制的是 Harbor 的根 CA 证书(即签发服务器证书的那个 CA),不是服务器自己的
.crt或.cert文件 - 执行命令时务必重命名:
cp harbor-ca.crt /etc/docker/certs.d/harbor.example.com/ca.crt - 可以用
openssl x509 -in /etc/docker/certs.d/harbor.example.com/ca.crt -text -noout | head -10检查是否为 CA 类型(输出里要有CA:TRUE)
登录前先验证证书是否生效
别急着 docker login,先用 curl 测试底层 HTTPS 连通性和证书信任状态。
- 运行
curl -v https://harbor.example.com/api/v2.0/health - 如果返回
SSL certificate problem: unable to get local issuer certificate,说明证书没放对位置或不是 CA 证书 - 如果返回
HTTP/2 200且有{"status":"healthy"},说明证书已就绪,可以登录 - 高版本 Docker(14+)默认强制 HTTPS,且拒绝 IP 访问,只认域名——这点最容易被忽略
登录命令本身要简洁,避免冗余参数
大多数报错源于多写了不该写的选项,或用了过时语法。
- 推荐写法:
docker login harbor.example.com -u admin -p Harbor12345 - 不要加
--password-stdin或-p后跟变量(容易被 shell 展开出错) - 如果密码含特殊字符(如
$、!),建议直接交互式输入,或用单引号包裹:-p 'Harbor@2026!' - 首次登录失败后,Docker 会缓存失败状态;可先执行
docker logout harbor.example.com再试
最常被跳过的环节是:确认 Harbor 的 hostname 和客户端访问域名完全一致、证书是根 CA 而非服务端证书、ca.crt 名字一字不差。这三个点卡住,再怎么重启 Docker 也没用。











