Docker TLS 证书一键生成脚本(安全加密远程访问)

Docker TLS 证书一键生成脚本(安全加密远程访问)

这是一键自动生成 Docker TLS 加密证书 的 Shell 脚本,无需手动输入复杂命令,自动生成 CA 证书、服务端证书、客户端证书,配置好权限,直接复制就能用,完美适配 CentOS7 / AlmaLinux9。

脚本功能

  1. 一键生成 CA 根证书 + Docker 服务端证书 + 客户端证书
  2. 自动设置证书权限(Docker 强制要求证书权限 600/400)
  3. 自动打包客户端证书(方便下载到本地使用)
  4. 自动输出 Docker 守护进程 TLS 启动配置
  5. 支持自定义服务器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

  1. 下载到本地电脑
  2. 解压得到 3 个文件:
    • ca.pem
    • cert.pem
    • key.pem
  3. 使用命令远程连接:
bash 复制代码
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H 你的服务器IP:2376 info

总结

  1. 一键生成:无需手动输入 openssl 命令,全自动生成
  2. 安全合规:证书权限严格按照 Docker 要求配置
  3. 开箱即用:自动输出配置,直接复制就能启用 TLS 加密
  4. 远程安全:2376 端口加密访问,杜绝未授权访问
相关推荐
张3232 小时前
OCI 镜像标准 ↔ Docker 镜像分层原理
docker
斯普信云原生组2 小时前
Docker 开源软件应急处理方案及操作手册——日常维护与监控命令集
docker·容器·eureka
迷路爸爸1802 小时前
Docker 入门学习笔记 01:它到底解决了什么问题,镜像和容器又是什么
服务器·笔记·学习·docker·容器
闻哥2 小时前
Docker Swarm 负载均衡深度解析:VIP vs DNSRR 模式详解
java·运维·jvm·docker·容器·负载均衡
正经教主16 小时前
【docker基础】第一课、从零开始理解容器技术
docker·云原生·容器·eureka
萌萌哒草头将军16 小时前
CloudDock(云仓):新一代开源NAS网络代理工具
服务器·网络协议·docker
正经教主18 小时前
【docker基础】0、系统学习docker之总计划
学习·docker·容器
Yang三少喜欢撸铁19 小时前
【Centos7通过kubeadm方式部署kubernetes1.30版本【一主两从】】
docker·kubernetes·container
杨浦老苏21 小时前
开源宠物健康护理追踪器EinVault
docker·群晖·宠物·健康管理