Docker TLS 证书一键生成脚本(安全加密远程访问)
这是一键自动生成 Docker TLS 加密证书 的 Shell 脚本,无需手动输入复杂命令,自动生成 CA 证书、服务端证书、客户端证书,配置好权限,直接复制就能用,完美适配 CentOS7 / AlmaLinux9。
脚本功能
- 一键生成 CA 根证书 + Docker 服务端证书 + 客户端证书
- 自动设置证书权限(Docker 强制要求证书权限 600/400)
- 自动打包客户端证书(方便下载到本地使用)
- 自动输出 Docker 守护进程 TLS 启动配置
- 支持自定义服务器IP/域名(必须填写,否则远程无法连接)
Docker TLS 证书一键生成脚本
docker_tls_gen.sh
bash
#!/bin/bash
# Docker TLS 证书一键生成脚本
# 作用:生成安全加密证书,用于 Docker 远程加密访问 (2376端口)
# 执行:chmod +x docker_tls_gen.sh && ./docker_tls_gen.sh
# 注意:必须填写你的服务器公网IP/域名
set -e
# ====================== 请修改这里 ======================
# 你的 Docker 服务器 IP 或者 域名(远程访问使用)
DOCKER_HOST="192.168.1.100"
# 证书存放目录
CERT_DIR="/etc/docker/certs.d"
# 证书有效期(天)
EXPIRY_DAYS=3650
# ========================================================
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# 检查 root 权限
if [ $(id -u) -ne 0 ]; then
echo -e "${RED}请使用 root 用户执行脚本!${NC}"
exit 1
fi
# 检查 openssl
if ! command -v openssl &> /dev/null; then
echo -e "${YELLOW}正在安装 openssl...${NC}"
yum install -y openssl
fi
# 创建证书目录
mkdir -p ${CERT_DIR}
cd ${CERT_DIR}
echo -e "${GREEN}==================== 开始生成 Docker TLS 证书 ====================${NC}"
echo -e "${YELLOW}服务器地址:${DOCKER_HOST}${NC}"
echo -e "${YELLOW}证书目录:${CERT_DIR}${NC}"
# ========== 1. 生成 CA 根证书 ==========
echo -e "\n${YELLOW}[1/5] 生成 CA 根证书...${NC}"
openssl genrsa -aes256 -passout pass:docker -out ca-key.pem 4096
openssl req -new -x509 -days ${EXPIRY_DAYS} -key ca-key.pem -passin pass:docker -sha256 -out ca.pem -subj "/CN=docker-ca"
# ========== 2. 生成服务端私钥 ==========
echo -e "${YELLOW}[2/5] 生成服务端私钥...${NC}"
openssl genrsa -aes256 -passout pass:docker -out server-key.pem 4096
# ========== 3. 生成服务端证书签名请求 ==========
echo -e "${YELLOW}[3/5] 生成服务端证书签名请求...${NC}"
openssl req -new -key server-key.pem -passin pass:docker -sha256 -out server.csr -subj "/CN=${DOCKER_HOST}"
# 配置扩展信息(支持IP/域名)
echo "subjectAltName = IP:${DOCKER_HOST},IP:127.0.0.1" > extfile.cnf
echo "extendedKeyUsage = serverAuth" >> extfile.cnf
# ========== 4. 签发服务端证书 ==========
echo -e "${YELLOW}[4/5] 签发服务端证书...${NC}"
openssl x509 -req -days ${EXPIRY_DAYS} -in server.csr -CA ca.pem -CAkey ca-key.pem -passin pass:docker -CAcreateserial -out server-cert.pem -extfile extfile.cnf
# ========== 5. 生成客户端证书 ==========
echo -e "${YELLOW}[5/5] 生成客户端证书...${NC}"
openssl genrsa -aes256 -passout pass:docker -out key.pem 4096
openssl req -new -key key.pem -passin pass:docker -out client.csr -subj '/CN=client'
echo "extendedKeyUsage = clientAuth" > extfile-client.cnf
openssl x509 -req -days ${EXPIRY_DAYS} -in client.csr -CA ca.pem -CAkey ca-key.pem -passin pass:docker -CAcreateserial -out cert.pem -extfile extfile-client.cnf
# 删除临时文件
rm -f ./*csr ./*srl extfile.cnf extfile-client.cnf
# 移除证书密码(方便Docker启动,无需手动输入密码)
echo -e "\n${YELLOW}移除证书密码...${NC}"
openssl rsa -in server-key.pem -passin pass:docker -out server-key.pem
openssl rsa -in key.pem -passin pass:docker -out key.pem
# 设置证书权限(Docker 强制要求)
echo -e "${YELLOW}设置证书安全权限...${NC}"
chmod -v 0400 ca-key.pem server-key.pem key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem
chown -v root:root ./*
# 打包客户端证书
tar zcf docker-client-certs.tar.gz ca.pem cert.pem key.pem
echo -e "\n${GREEN}==================== 证书生成完成!====================${NC}"
echo -e "${GREEN}证书目录:${CERT_DIR}${NC}"
echo -e "${GREEN}客户端证书包:${CERT_DIR}/docker-client-certs.tar.gz${NC}"
# 输出 Docker 启动配置
echo -e "\n${YELLOW}==================== Docker TLS 启动配置 ====================${NC}"
cat << EOF
请将以下配置写入 /etc/docker/daemon.json :
{
"hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"],
"tls": true,
"tlsverify": true,
"tlscacert": "${CERT_DIR}/ca.pem",
"tlscert": "${CERT_DIR}/server-cert.pem",
"tlskey": "${CERT_DIR}/server-key.pem"
}
配置完成后重启 Docker:
systemctl daemon-reload
systemctl restart docker
远程连接命令(客户端):
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H ${DOCKER_HOST}:2376 info
EOF
使用方法(3 步搞定)
1. 脚本内修改服务器IP
打开脚本,把 DOCKER_HOST 改成你自己的服务器IP/域名
bash
DOCKER_HOST="192.168.1.100" # 改成你的服务器公网IP
2. 授权并执行
bash
chmod +x docker_tls_gen.sh
./docker_tls_gen.sh
3. 配置 Docker 并重启
脚本执行完成后,自动输出配置,直接复制粘贴即可:
bash
# 编辑 Docker 配置
vi /etc/docker/daemon.json
# 粘贴脚本输出的配置
# 保存退出
# 重启 Docker
systemctl daemon-reload
systemctl restart docker
客户端远程连接 Docker
脚本会自动打包客户端证书:/etc/docker/certs.d/docker-client-certs.tar.gz
- 下载到本地电脑
- 解压得到 3 个文件:
ca.pemcert.pemkey.pem
- 使用命令远程连接:
bash
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H 你的服务器IP:2376 info
总结
- 一键生成:无需手动输入 openssl 命令,全自动生成
- 安全合规:证书权限严格按照 Docker 要求配置
- 开箱即用:自动输出配置,直接复制就能启用 TLS 加密
- 远程安全:2376 端口加密访问,杜绝未授权访问