docker daemon仅信任系统ca池且严格校验证书路径,须将根证书复制到/etc/docker/certs.d/域名:端口/ca.crt并重启docker服务;证书需含san支持ip或域名,registry容器也须正确挂载tls证书启用https。
核心问题不是“客户端不安全”,而是 docker daemon 根本不信任你的证书——它只认系统 ca 池,且对私有仓库的证书有严格路径要求。解决的关键是让宿主机上的 docker daemon 显式信任你的证书,而不是改客户端或浏览器设置。
证书必须放到 daemon 能识别的固定路径
Docker daemon 不会读取 /etc/ssl/certs/ 或容器内挂载的证书,它只检查 /etc/docker/certs.d/ 下与仓库地址完全匹配的子目录中的 ca.crt 文件。
- 如果你的仓库地址是
192.168.50.10:5000,就创建目录:mkdir -p /etc/docker/certs.d/192.168.50.10:5000 - 把你的根证书(比如
domain.crt)复制进去并重命名为ca.crt:cp domain.crt /etc/docker/certs.d/192.168.50.10:5000/ca.crt - 路径名必须含端口,写成
192.168.50.10或registry.local(没端口)都会失败
证书本身要能支撑 IP 或域名访问
自签名证书默认不支持 IP 地址访问,直接用 openssl req -x509 生成会报 subject alternative name missing。
- 生成前先配置 OpenSSL 支持 SAN:在
/etc/pki/tls/openssl.cnf的[ v3_ca ]段添加:subjectAltName = IP:192.168.50.10,DNS:registry.local - 再执行生成命令:
openssl req -newkey rsa:4096 -nodes -sha256 -keyout domain.key -x509 -days 3650 -out domain.crt -subj "/CN=registry.local" -config /etc/pki/tls/openssl.cnf -extensions v3_ca - 浏览器或 curl 访问时加
-k只是跳过校验,不能解决 Docker push 报错
启动 registry 容器时正确挂载证书
Registry 服务自身也要用证书启用 HTTPS,否则即使 daemon 信任了,服务端仍是 HTTP。
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 把
domain.crt和domain.key放到宿主机一个目录,例如/opt/registry/certs/ - 运行命令中指定 TLS 参数:
docker run -d -p 5000:5000 --name registry -v /opt/registry/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key registry:2 - 不要用
--insecure-registry,那是临时绕过方案,不是解决 HTTPS
验证和常见卡点
做完以上三步后,重启 daemon 并逐项验证:
- 重启 Docker:
systemctl restart docker - 用 curl 测试服务端是否响应 HTTPS:
curl -v https://192.168.50.10:5000/v2/,看到200 OK说明服务端正常 - 登录仓库:
docker login 192.168.50.10:5000,如果提示no basic auth credentials,说明认证没配,跟证书无关 - 推送前务必打 tag:
docker tag nginx:alpine 192.168.50.10:5000/nginx:alpine,然后docker push
不复杂但容易忽略










