开启tls双向认证(mtls)是防止黑客利用docker远程api篡改容器的最直接有效手段,需服务端证书覆盖所有访问入口(含ip/dns的san)、ca根证书4096位rsa、daemon.json禁用明文端口并启用tlsverify:true、客户端严格校验证书且权限设为600。
配置 docker engine 的 tls 双向认证(mtls)本质是让服务端和客户端都“验明正身”,不是只加密,而是双向确认身份。核心就三件事:生成可信证书、关闭明文入口、客户端严格校验。
一、生成强信任的证书体系
所有证书必须基于同一套 CA,且关键字段不能遗漏:
- 用 4096 位 RSA 生成 CA 私钥(
ca-key.pem),并签发根证书(ca.pem),有效期建议 2–3 年 - 服务端证书(
server-cert.pem)必须包含所有实际访问地址——不仅是域名,还要把所有可能用到的 IP 全列进 SAN(Subject Alternative Name),例如:DNS:docker.internal, IP:192.168.5.100, IP:127.0.0.1 - 客户端证书(
client-cert.pem)需明确标记用途为clientAuth,生成时通过extfile.cnf设置extendedKeyUsage=clientAuth - 所有私钥文件(
ca-key.pem、server-key.pem、client-key.pem)权限必须设为600,属主为root:docker
二、强制 Daemon 启用双向验证
仅开启 TLS 不等于启用双向认证,"tls": true 只做单向加密;真正起效的是 "tlsverify": true,且必须配合关闭明文端口:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 编辑
/etc/docker/daemon.json,彻底删除或注释掉任何tcp://:2375类配置 -
hosts字段只保留安全入口,例如:["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"]
- 明确指定三项路径(必须是绝对路径):
"tlscacert"、<code>"tlscert"、"tlskey" - 重启生效:
systemctl daemon-reload && systemctl restart docker
三、客户端必须携带并校验证书
服务端配得再严,客户端跳过验证就前功尽弃:
- 把
ca.pem、client-cert.pem、client-key.pem放入~/.docker/(Linux/macOS)或C:/Users/xxx/.docker/(Windows) - 设置环境变量(推荐,避免每次敲长命令):
export DOCKER_TLS_VERIFY=1
export DOCKER_HOST=tcp://192.168.5.100:2376
export DOCKER_CA_PATH=$HOME/.docker - 验证是否成功:
docker info | grep "Server Version"能返回结果,说明 mTLS 握手通过;若报x509: certificate signed by unknown authority,说明 CA 未被客户端信任
四、更轻量的替代思路(可选)
如果不需要暴露 TCP 端口,SSH 上下文是更简洁的安全方案:
- 不开放
2376,完全禁用远程 TCP 监听 - 用
docker context create ssh --ssh-host=user@192.168.5.100 my-remote创建 SSH 上下文 - 切换后直接执行
docker ps,所有通信走加密 SSH 隧道,无需管理证书










