Docker启用TLS加密解决暴露2375端口引发的安全漏洞,被黑掉三台云主机的教训总结
1. 设置主机名
编辑/etc/hostname,服务器主机名 ubuntu
1 | vi /etc/hostname |
2. 生成TLS证书
创建证书生成脚本 docker-cert.sh,放置/script目录
1 | sudo mkdir -p /script /data/cert/docker |
docker-cert.sh添加内容
1 |
|
执行 docker-cert.sh 脚本,生成证书放置 /data/cert/docker 目录中
1 | # ubuntu是服务器的主机名 |
按照提示输入相关信息,密码一致就行,其他信息可留空,等脚本指定完成之后,可在 /data/cert/docker 目录查看到生成的证书。
Docker 只接受「未加密的私钥」
你给的 .key 文件是 RSA 加密私钥(文件头里能看到 —–BEGIN RSA PRIVATE KEY—– 或 Proc-Type: 4,ENCRYPTED),启动时 dockerd
要求你输入密码,但它跑在 systemd 里没人交互,于是读密钥失败 → TLS 配置无效 → dockerd 直接退出。
一句话结论
私钥被加密了,Docker 不会解密,必须换成“无密码”的私钥。
如果私钥仍带密码,先按前面说的去密码:
1 | sudo openssl rsa -in server-key.pem -out server-key-clear.pem |
证书生成过程问题解决
OpenSSL 报错写得很清楚:
1 | bad ip address … value=ubuntu |
你在 extfile.cnf 里把 主机名(ubuntu)直接写进了 IP: 字段,而 IP: 后面必须是纯 IPv4/IPv6 地址,不能是字符串域名或主机名。
改成 DNS:ubuntu 或者干脆去掉域名,只保留合法 IP 即可。
修正扩展文件
1 | cat > extfile.cnf <<EOF |
如果你只想让任何地址都能连,也可以最简写:
1 | echo "subjectAltName = IP:0.0.0.0" > extfile.cnf |
重新签发
1 | openssl x509 -req -in server.csr \ |
验证
1 | openssl x509 -in server-cert.pem -text -noout | grep -A1 "Subject Alternative Name" |
应看到:
1 | X509v3 Subject Alternative Name: |
不再报错即可。
查看生成后的证书

3. 配置Docker启用TLS
1 | sudo cat /usr/lib/systemd/system/docker.service |
在ExecStart属性后追加
1 | --tlsverify --tlscacert=/data/cert/docker/ca.pem \ |
1 | --tlsverify --tlscacert=/data/cert/docker/ca.pem --tlscert=/data/cert/docker/server-cert.pem --tlskey=/data/cert/docker/server-key.pem -H tcp://0.0.0.0:2376 -H unix://var/run/docker.sock |

重新加载docker配置后重启
1 | sudo systemctl daemon-reload |
查看2376端口是否启动
1 | netstat -nltp | grep 2376 |

本地连接测试Docker API是否可用
- 没有指定证书访问测试
1 | curl https://ubuntu:2376/info |
- 指定证书访问测试
1 | curl https://ubuntu:2376/info --cert /data/cert/docker/cert.pem --key /data/cert/docker/key.pem --cacert /data/cert/docker/ca.pem |
4. IDEA配置
将客户端所需的ca.pem、cert.pem、key.pem3个密钥文件从服务器下载到本地

IDEA连接Docker配置修改

pom.xml
1 |
|