一键生成证书、密钥脚本
#!/bin/bash
CERT_DIR="./ssl"
DOMAIN="example.com"
DAYS=365
KEY_FILE="$CERT_DIR/$DOMAIN.key"
CSR_FILE="$CERT_DIR/$DOMAIN.csr"
CRT_FILE="$CERT_DIR/$DOMAIN.crt"
PEM_FILE="$CERT_DIR/$DOMAIN.pem"
mkdir -p "$CERT_DIR"
echo "🔐 生成私钥..."
openssl genrsa -out "$KEY_FILE" 2048
echo "📄 生成 CSR..."
openssl req -new -key "$KEY_FILE" -out "$CSR_FILE" -subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/OU=IT/CN=$DOMAIN"
echo "✅ 生成自签名证书..."
openssl x509 -req -in "$CSR_FILE" -signkey "$KEY_FILE" -out "$CRT_FILE" -days "$DAYS"
echo "📦 合并 PEM(可选)..."
cat "$CRT_FILE" "$KEY_FILE" > "$PEM_FILE"
ls -l "$CERT_DIR"
nginx配置
ssl_certificate /etc/ssl/example.com.crt;
ssl_certificate_key /etc/ssl/example.com.key;
脚本解释
这是一个一键生成自签名SSL证书的Shell脚本,逐行解释如下:
脚本结构解析
1. Shebang & 配置变量
bash
#!/bin/bash
CERT_DIR="./ssl" # 证书输出目录(当前目录下ssl文件夹)
DOMAIN="example.com" # 证书的通用名称(CN)
DAYS=365 # 证书有效期
2. 文件路径变量
bash
KEY_FILE="$CERT_DIR/$DOMAIN.key" # 私钥文件
CSR_FILE="$CERT_DIR/$DOMAIN.csr" # 证书签名请求
CRT_FILE="$CERT_DIR/$DOMAIN.crt" # 证书文件(PEM格式)
PEM_FILE="$CERT_DIR/$DOMAIN.pem" # 合并的PEM文件(证书+私钥)
3. 创建输出目录
bash
mkdir -p "$CERT_DIR" # -p 表示递归创建,若目录存在则不报错
4. 生成私钥 (2048位RSA)
bash
openssl genrsa -out "$KEY_FILE" 2048
- 输出文件:
./ssl/example.com.key - 以
-----BEGIN PRIVATE KEY-----开头
5. 创建CSR(免交互方式)
bash
openssl req -new -key "$KEY_FILE" -out "$CSR_FILE" -subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/OU=IT/CN=$DOMAIN"
-subj参数 :直接指定证书主题,避免交互式输入C=CN:国家(China)ST=Beijing:省份L=Beijing:城市O=MyCompany:组织OU=IT:部门CN=$DOMAIN:通用名称(域名)
6. 自签名证书
bash
openssl x509 -req -in "$CSR_FILE" -signkey "$KEY_FILE" -out "$CRT_FILE" -days "$DAYS"
- 用私钥对CSR进行自签名
- 输出:
./ssl/example.com.crt
7. 合并PEM文件(可选)
bash
cat "$CRT_FILE" "$KEY_FILE" > "$PEM_FILE"
- 将证书和私钥合并成一个文件
- 用途:某些服务(如Nginx)需要合并文件
8. 列出生成的证书文件
bash
ls -l "$CERT_DIR"
最终生成的文件
执行后 ./ssl/ 目录下生成:
example.com.key # 私钥(敏感,勿泄露)
example.com.csr # 证书请求(可丢弃)
example.com.crt # 自签名证书
example.com.pem # 合并文件(证书+私钥)
使用场景
- 测试/开发环境的HTTPS配置
- 内部网络服务加密
- CI/CD流水线中快速生成测试证书
⚠️ 注意事项
- 自签名证书浏览器会显示不安全
- 生产环境应使用CA机构签发的证书
- 脚本路径为相对路径(
./ssl),可在任意目录执行