关键在于:使用根CA证书(非服务器证书)、路径与文件名严格匹配为/etc/docker/certs.d/{域名}/ca.crt、域名须与证书SAN/CN一致;部署后通常无需重启Docker,直接docker login即可。
要让 docker 客户端信任自签名证书的私有仓库并成功登录,关键不在“重启 docker”或“改配置文件”,而在于三点:证书必须是根 ca 证书、路径和命名严格匹配、域名与证书 san 或 cn 一致。下面分步说明实际操作要点。
证书准备:必须用根 CA 证书,不是服务器证书
很多失败源于把 server.crt(服务器证书)当成了信任对象。Docker 客户端只认根 CA 证书(即你用 openssl req -x509 生成的 ca.crt),它用来验证仓库返回的服务器证书是否可信。
- 确认你手上有
ca.crt—— 是创建 CA 时生成的那个,不是后来签发给 registry 的server.crt - 检查证书内容是否为 CA:
openssl x509 -in ca.crt -text -noout | grep "CA:TRUE",应输出CA:TRUE - 若用 Harbor 或 Nginx 反代,确保仓库服务本身已正确加载
server.crt+server.key,且其subjectAltName包含访问域名(如DNS:harbor.example.com)
客户端证书部署:路径、命名、权限三要素
Docker 客户端按固定规则扫描证书,不满足任一条件都会忽略:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 目录路径必须是
/etc/docker/certs.d/{域名}[:端口]/,例如仓库地址是https://harbor.example.com→ 目录为/etc/docker/certs.d/harbor.example.com/;若是https://reg.internal:8443→ 目录为/etc/docker/certs.d/reg.internal:8443/ - 证书文件名必须是
ca.crt(全小写,不能是harbor-ca.crt或ca.pem) - 文件权限建议为
644,属主不限,但需确保 Docker 进程可读(通常 root 写入即可)
登录测试与排错要点
部署完证书后直接登录,绝大多数情况无需重启 Docker 服务:
- 执行
docker login https://harbor.example.com -u admin -p xxx(注意带https://前缀更稳妥) - 若报错
x509: certificate signed by unknown authority,先检查:
– 是否用了ca.crt而非服务器证书
– 目录名是否和实际访问域名完全一致(包括大小写、端口)
– 证书是否过期:openssl x509 -in /etc/docker/certs.d/.../ca.crt -dates -noout - 仅当反复确认证书无误仍失败时,再尝试
sudo systemctl restart docker,但这是例外,不是常规步骤
额外提醒:主机 hosts 和时间同步
两个容易被忽略但高频导致失败的因素:
-
hosts 解析:确保客户端能通过域名访问仓库,必要时在
/etc/hosts添加映射,如192.168.10.50 harbor.example.com -
系统时间准确:证书有效期依赖本地时间,误差超过几分钟就可能触发“证书尚未生效”或“已过期”错误。建议开启
chronyd或ntpd同步

















