必须通过tls加密通信,否则docker命令明文传输易被截获;需生成ca、服务端、客户端三类证书,配置daemon.json启用tlsverify:true并严格校验证书。
客户端与 docker 守护进程(daemon)之间必须通过 tls 加密通信,否则所有命令(如 docker ps、docker exec)都以明文传输,极易被本地提权攻击或恶意进程截获。这不是可选项,而是生产环境的强制安全基线。
生成并分发三类 TLS 证书
需分别准备 CA 根证书、服务端证书(供 daemon 使用)、客户端证书(供 docker CLI 使用),全部基于同一 CA 签发,确保信任链完整:
-
CA 证书:用
openssl genrsa -aes256 -out ca-key.pem 4096生成加密私钥,再用openssl req -new -x509 -days 3650 -key ca-key.pem -out ca.pem生成根证书;密码建议由密钥管理系统统一托管,避免硬编码 -
服务端证书:生成 server-key.pem 后,用
openssl req -new -key server-key.pem -out server.csr -subj "/CN=your-docker-host"创建 CSR,再用 CA 签发server.pem;注意CN必须与客户端连接时使用的主机名一致(如unix:///var/run/docker.sock不适用,仅限 TCP 模式) -
客户端证书:同样生成 client-key.pem 和 client.csr,但
subj中CN可设为任意标识(如/CN=admin),签发为client.pem;该证书将用于证明客户端身份
配置守护进程启用 TLS
编辑 /etc/docker/daemon.json,明确指定证书路径并禁用非加密监听:
{
"hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"],
"tls": true,
"tlscacert": "/etc/docker/ca.pem",
"tlscert": "/etc/docker/server.pem",
"tlskey": "/etc/docker/server-key.pem",
"tlsverify": true
}
重启守护进程:sudo systemctl restart docker。此时 daemon 只响应带有效客户端证书的 TLS 连接,拒绝任何未认证请求。
配置客户端使用证书通信
在客户端机器上,将 ca.pem、client.pem、client-key.pem 放入标准目录:
- Linux/macOS:
~/.docker/ca.pem、~/.docker/cert.pem、~/.docker/key.pem(注意文件名固定,不能自定义) - 或通过环境变量显式指定:
export DOCKER_HOST=tcp://your-host:2376,export DOCKER_TLS_VERIFY=1,export DOCKER_CERT_PATH=/path/to/certs
验证是否生效:docker --tlsverify version 应返回服务端信息;若报错 x509: certificate signed by unknown authority,说明 CA 证书未正确加载。
关键注意事项
实际部署中容易忽略几个细节:
- 服务端证书的
Subject Alternative Name (SAN)建议包含 IP 和域名,否则客户端用 IP 访问时可能校验失败;可用openssl x509 -in server.pem -text -noout检查 - 客户端私钥
client-key.pem权限必须为0600,否则 docker CLI 会拒绝加载 - 若使用 systemd 启动 docker,还需检查
/lib/systemd/system/docker.service中是否覆盖了ExecStart,导致 daemon.json 配置失效 - 不推荐在内网关闭 TLS(如设
"tls": false),因为本地攻击面(如恶意容器、rootkit)仍可直接读取 socket 流量











