文章

linux生成自签证书脚本

浏览: 30评论: 0发布时间: 2026-01-12

创建脚本文件

vi gencert.sh

脚本内容

#!/bin/bash
 
if [ -z "$1" ]; then
  echo "❌ 错误: 请输入域名作为参数。"
  echo "用法: ./gencert.sh <域名>"
  echo "示例: ./gencert.sh myserver.local"
  exit 1
fi
 
DOMAIN=$1
IP_ADDR=$(hostname -I | cut -d' ' -f1) # 尝试自动获取本机内网IP
 
echo "--- 开始为域名 [$DOMAIN] 生成证书 ---"
 
# 1. 生成根证书 (Root CA) - 如果已存在则跳过,避免每次都让用户重新安装
if [ ! -f "rootCA.key" ]; then
  echo " -> 生成根证书私钥 (rootCA.key)..."
  openssl genrsa -out rootCA.key 2048
  
  echo " -> 生成根证书公钥 (rootCA.crt) - 【这个发给 Windows/Mac 安装】..."
  # 有效期 10 年,CN 名字设为明显的名字方便你在电脑里找到它
  openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.crt -subj "/C=CN/ST=Locahost/L=Localhost/O=MyLocalDev/CN=My-Local-Root-CA"
else
  echo " -> 检测到已存在 rootCA.key 和 rootCA.crt,将使用现有的根证书签发。"
fi
 
# 2. 生成 Nginx 服务器私钥
echo " -> 生成服务器私钥 ($DOMAIN.key)..."
openssl genrsa -out $DOMAIN.key 2048
 
# 3. 生成 CSR (证书签名请求)
echo " -> 生成证书签名请求 ($DOMAIN.csr)..."
openssl req -new -key $DOMAIN.key -out $DOMAIN.csr -subj "/C=CN/ST=Locahost/L=Localhost/O=MyLocalDev/CN=$DOMAIN"
 
# 4. 创建临时的扩展配置文件 (解决 Chrome/Edge 安全警告的关键)
# 我们会自动把 域名、泛域名(*.域名)、localhost 和检测到的内网 IP 都加进去
cat > v3.ext <<EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
 
[alt_names]
DNS.1 = $DOMAIN
DNS.2 = *.$DOMAIN
DNS.3 = localhost
IP.1 = 127.0.0.1
IP.2 = $IP_ADDR
EOF
 
# 5. 使用根证书签发服务器证书
echo " -> 使用根证书签发服务器证书 ($DOMAIN.crt)..."
# 有效期 825 天 (macOS 对服务器证书的最大宽容度,超过会被以此为由拒绝)
openssl x509 -req -in $DOMAIN.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out $DOMAIN.crt -days 825 -sha256 -extfile v3.ext
 
# 6. 清理临时文件
rm $DOMAIN.csr v3.ext
 
echo ""
echo "✅ 生成成功!"
echo "------------------------------------------------------"
echo "📂 [给 Nginx 用] :"
echo "   - 证书文件: $PWD/$DOMAIN.crt"
echo "   - 私钥文件: $PWD/$DOMAIN.key"
echo ""
echo "📂 [给 Windows/Mac 电脑用] :"
echo "   - 根证书:   $PWD/rootCA.crt"
echo "   (请把这个文件下载到电脑,双击安装到'受信任的根证书颁发机构')"
echo "------------------------------------------------------"

调用方法

chmod +x gencert.sh
./gencert.sh myserver.local