必须启用tls双向认证并严格校验证书,否则远程管理接口极易被中间人劫持或未授权访问;核心是让docker daemon拒绝任何不带有效客户端证书或证书未由可信ca签发的连接。

必须启用 TLS 双向认证并严格校验证书,否则远程管理接口极易被中间人劫持或未授权访问。核心是让 Docker Daemon 拒绝任何不带有效客户端证书、或证书未由可信 CA 签发的连接。
一、生成匹配访问方式的证书(关键在 SAN)
服务端证书必须包含所有实际用于连接的 IP 和域名,否则客户端会因 SAN 不匹配而拒绝连接:
- 用 OpenSSL 创建 CA 根证书(ca.pem + ca-key.pem),全程使用 4096 位密钥增强安全性
- 生成服务端证书时,明确写入 Subject Alternative Name(SAN),例如:
IP:192.168.5.100,IP:127.0.0.1,DNS:prod-docker.internal
若通过公网域名访问,DNS 条目不可遗漏;若仅用内网 IP,则必须列出所有可能的访问 IP - 客户端证书由同一 CA 签发即可,无需 SAN,但建议按角色命名(如 deploy.pem、admin.pem),便于后续吊销
二、配置 daemon.json 强制 TLS 验证
编辑 /etc/docker/daemon.json,确保只保留安全端口且启用双向校验:
- "hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"] —— 移除 tcp://:2375 等明文端口
- "tlsverify": true(或 "tls": true)—— 启用服务端和客户端双向证书验证
- "tlscacert"、"tlscert"、"tlskey" 全部填绝对路径,如 "/etc/docker/certs/ca.pem"
- 私钥文件(server-key.pem)权限设为 600,属主为 root:docker
保存后执行 sudo systemctl daemon-reload && sudo systemctl restart docker 生效。
三、客户端必须携带有效证书连接
不能仅靠 IP 和端口访问,客户端需提供由同一 CA 签发的证书对:
- Linux/macOS:把 ca.pem、cert.pem、key.pem 放入 ~/.docker/,确保 cert.pem 和 key.pem 权限为 600
- 设置环境变量(推荐,避免每次输参数):
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",能正常返回即表示 TLS 握手完成
四、替代方案:用 SSH 上下文更轻量安全
若不需要暴露 TCP 端口,可完全绕过 TLS 配置,改用 Docker 原生 SSH 上下文:
- 在本地执行:docker context create --docker host=ssh://user@192.168.5.100 my-prod
- 切换后所有 docker 命令自动走 SSH 加密通道:docker context use my-prod
- 无需生成证书、不开放额外端口、复用系统 SSH 权限体系,适合多数运维场景











