script/generate-tls.sh

66 lines
2.1 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 定义证书存储目录
CERT_DIR="/etc/docker/certs"
mkdir -p "$CERT_DIR"
cd "$CERT_DIR"
# 提示用户输入主机名/IP 地址列表
read -p "请输入 Docker 守护进程的主机名或 IP 地址用逗号分隔例如10.0.10.19,localhost: " DOCKER_HOSTS
if [ -z "$DOCKER_HOSTS" ]; then
echo "主机名/IP 地址不能为空!"
exit 1
fi
# 生成 CA 私钥和证书
openssl genrsa -out ca-key.pem 4096
openssl req -x509 -new -nodes -key ca-key.pem -days 36500 -out ca.pem -subj "/C=CN/ST=Chongqing/L=Chongqing/O=LiteyukiStudio/CN=MyCA"
# 生成服务器密钥和证书签名请求CSR
openssl genrsa -out server-key.pem 4096
openssl req -new -key server-key.pem -out server.csr -subj "/C=CN/ST=Chongqing/L=Chongqing/O=LiteyukiStudio/CN=$DOCKER_HOSTS"
# 创建一个配置文件来指定 SANs
cat > san.cnf <<EOF
[req]
distinguished_name = req_distinguished_name
req_extensions = req_ext
[req_distinguished_name]
[req_ext]
subjectAltName = @alt_names
[alt_names]
EOF
# 将输入的主机名/IP 地址分割为数组
IFS=',' read -r -a HOSTS <<< "$DOCKER_HOSTS"
# 为每个主机添加 DNS 和 IP 条目到 SANs
for i in "${!HOSTS[@]}"; do
echo "DNS.$((i+1)) = ${HOSTS[$i]}" >> san.cnf
echo "IP.$((i+1)) = ${HOSTS[$i]}" >> san.cnf
done
# 生成服务器证书
openssl x509 -req -days 36500 -in server.csr -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem -extfile san.cnf -extensions req_ext
# 删除不必要的 CSR 文件和配置文件
rm -f server.csr san.cnf
# 生成客户端密钥和证书签名请求CSR
openssl genrsa -out client-key.pem 4096
openssl req -new -key client-key.pem -out client.csr -subj "/C=CN/ST=Chongqing/L=Chongqing/O=LiteyukiStudio/CN=client"
# 生成客户端证书
openssl x509 -req -days 36500 -in client.csr -CA ca.pem -CAkey ca-key.pem -set_serial 02 -out client-cert.pem
# 删除不必要的客户端 CSR 文件
rm -f client.csr
# 设置权限
chmod 0400 ca-key.pem server-key.pem client-key.pem
chmod 0444 ca.pem server-cert.pem client-cert.pem
echo "证书生成完成,保存在 $CERT_DIR 目录下。"