启用tls双向认证(mtls)是防止黑客利用docker远程api篡改容器的最直接有效手段,需服务端证书覆盖所有访问入口(含ip/dns的san)、ca根证书4096位rsa、daemon.json禁用明文端口并启用tlsverify:true、客户端严格校验证书且权限设为600。
客户端与 docker 守护进程之间配置客户端证书认证,核心是启用 tls 双向验证(mtls):不仅服务端提供证书供客户端验证,客户端也必须提供由同一 ca 签发的有效证书,服务端据此确认其身份。整个过程不依赖用户名密码,安全性远高于基础认证或未加密的 tcp 暴露。
准备统一的证书颁发机构(CA)
所有证书必须由同一个私有 CA 签发,才能建立信任链。操作在宿主机上完成,建议统一存放在 /etc/docker/tls 目录:
- 生成 CA 私钥(设密码保护,如
sunmnet):openssl genrsa -aes256 -out ca-key.pem 4096 - 生成 CA 根证书(不设密码,供后续签名使用):
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
填写组织信息时 CN 可填Docker CA - 设置严格权限:
chmod 0400 ca-key.pem ca.pem
为守护进程(server)生成并签名证书
证书中的 CN 必须匹配客户端连接时使用的 IP 或域名(例如 192.168.20.145),且需通过 subjectAltName 显式声明可信任地址:
- 生成服务端私钥(不加密,避免启动时交互输入):
openssl genrsa -out server-key.pem 4096 - 创建证书签名请求(CSR),指定 CN 为服务端地址:
openssl req -subj "/CN=192.168.20.145" -new -key server-key.pem -out server.csr - 编写
extfile.cnf,明确允许该证书用于服务器身份验证,并列出所有合法访问地址:subjectAltName = IP:192.168.20.145,IP:127.0.0.1,DNS:localhostextendedKeyUsage = serverAuth - 用 CA 签发服务端证书:
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf - 清理临时文件,设权限:
rm server.csr extfile.cnf && chmod 0400 server-key.pem && chmod 0444 server-cert.pem
为客户端(CLI)生成并签名证书
客户端证书的 CN 可设为任意标识性名称(如 client),但必须用同一 CA 签发,且扩展用途明确为 clientAuth:
- 生成客户端私钥:
openssl genrsa -out client-key.pem 4096 - 创建客户端 CSR:
openssl req -subj "/CN=client" -new -key client-key.pem -out client.csr - 编写
extfile-client.cnf,指定用途:extendedKeyUsage = clientAuth - 用 CA 签发客户端证书:
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -extfile extfile-client.cnf - 清理并设权限:
rm client.csr extfile-client.cnf && chmod 0400 client-key.pem && chmod 0444 client-cert.pem
配置守护进程与客户端启用 TLS 认证
服务端和客户端需分别加载对应证书,且路径必须准确、权限合规:
- 修改
/etc/docker/daemon.json,启用 TLS 验证并指定证书路径:{<br> "tlsverify": true,<br> "tlscacert": "/etc/docker/tls/ca.pem",<br> "tlscert": "/etc/docker/tls/server-cert.pem",<br> "tlskey": "/etc/docker/tls/server-key.pem",<br> "hosts": ["tcp://0.0.0.0:2376"]<br>} - 重启守护进程:
systemctl daemon-reload && systemctl restart docker - 客户端调用时显式指定证书路径(Linux/macOS):
docker --tlsverify --tlscacert=/etc/docker/tls/ca.pem \<br> --tlscert=/etc/docker/tls/client-cert.pem \<br> --tlskey=/etc/docker/tls/client-key.pem \<br> -H tcp://192.168.20.145:2376 info
- 为简化日常使用,可将证书复制到用户目录并设置环境变量:
mkdir -p ~/.docker<br>cp /etc/docker/tls/{ca.pem,client-cert.pem,client-key.pem} ~/.docker/<br>export DOCKER_TLS_VERIFY=1<br>export DOCKER_CERT_PATH=~/.docker<br>export DOCKER_HOST=tcp://192.168.20.145:2376











