在开发和部署过程中,我们经常需要为通配符域名(如 *.example.com)生成 SSL 证书,以便保护所有子域的通信安全。本教程将指导您如何基于现有的根 CA 私钥和证书,生成可用于 Nginx 或其他 Web 服务器的通配符域名 SSL 证书。
准备工作
在开始之前,请确保以下工具和文件已准备好:
- OpenSSL:用于生成和签署证书。
- 根 CA 私钥文件:
JJS_CA.key。 - 根 CA 证书文件:
JJS_CA.crt。 - 目标域名:例如
*.example.com。
以下脚本实现了从私钥生成到最终 PEM 文件的全过程,并包含了详细的错误检查步骤。
#!/bin/bash
# 该脚本用于使用给定的根 CA 私钥和证书生成通配符域名的 SSL 证书。
# 在运行此脚本之前,请确保系统中已安装 openssl。
# 配置变量
ROOT_CA_KEY="JJS_CA.key" # 根 CA 私钥文件
ROOT_CA_CERT="JJS_CA.crt" # 根 CA 证书文件
DOMAIN="example.com" # 请替换为您的域名
DAYS_VALID=365 # 证书的有效期(天数)
# 输出文件名
DOMAIN_KEY="domain.key"
DOMAIN_CSR="domain.csr"
DOMAIN_CERT="domain.crt"
DOMAIN_PEM="domain.pem"
# 步骤 1: 为域名生成私钥
openssl genrsa -out "$DOMAIN_KEY" 2048
if [ $? -ne 0 ]; then
echo "错误: 域名私钥生成失败。"
exit 1
fi
# 步骤 2: 为域名创建证书签名请求(CSR)
openssl req -new -key "$DOMAIN_KEY" -out "$DOMAIN_CSR" \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/OU=IT/CN=*.${DOMAIN}"
if [ $? -ne 0 ]; then
echo "错误: 域名 CSR 生成失败。"
exit 1
fi
# 步骤 3: 使用根 CA 签署域名证书
openssl x509 -req -in "$DOMAIN_CSR" -CA "$ROOT_CA_CERT" -CAkey "$ROOT_CA_KEY" -CAcreateserial \
-out "$DOMAIN_CERT" -days "$DAYS_VALID" -sha256
if [ $? -ne 0 ]; then
echo "错误: 域名证书签署失败。"
exit 1
fi
# 步骤 4: 合并域名证书和根 CA 证书为 PEM 文件
cat "$DOMAIN_CERT" "$ROOT_CA_CERT" > "$DOMAIN_PEM"
if [ $? -ne 0 ]; then
echo "错误: PEM 文件生成失败。"
exit 1
fi
# 步骤 5: 验证生成的证书链
openssl verify -CAfile "$ROOT_CA_CERT" "$DOMAIN_PEM"
if [ $? -ne 0 ]; then
echo "警告: 证书验证失败。"
exit 1
fi
echo "SSL 证书已成功生成!"
echo "生成的文件:"
echo "- 私钥文件: $DOMAIN_KEY"
echo "- CSR 文件: $DOMAIN_CSR"
echo "- 证书文件: $DOMAIN_CERT"
echo "- PEM 文件: $DOMAIN_PEM"
脚本分步解析
1. 生成域名私钥
openssl genrsa -out domain.key 2048
这一步生成了域名的私钥文件 domain.key,它是证书的核心部分。
2. 创建 CSR 文件
openssl req -new -key domain.key -out domain.csr \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/OU=IT/CN=*.example.com"
CSR(Certificate Signing Request)是向 CA 申请证书的请求,包含了域名和组织信息。
3. 使用根 CA 签署域名证书
openssl x509 -req -in domain.csr -CA JJS_CA.crt -CAkey JJS_CA.key -CAcreateserial \
-out domain.crt -days 365 -sha256
这一步通过根 CA 签发域名证书 domain.crt,有效期为 1 年。
4. 合并证书链
cat domain.crt JJS_CA.crt > domain.pem
将域名证书和根 CA 证书合并为单一文件,便于 Web 服务器使用。
5. 验证证书
openssl verify -CAfile JJS_CA.crt domain.pem
验证生成的证书链是否正确。
运行效果
执行脚本后,您将获得以下文件:
- 私钥:
domain.key - CSR 文件:
domain.csr - 域名证书:
domain.crt - PEM 文件:
domain.pem
使用证书
在 Nginx 配置中,可以这样使用生成的证书:
server {
listen 443 ssl;
server_name *.example.com;
ssl_certificate /path/to/domain.pem;
ssl_certificate_key /path/to/domain.key;
# 其他配置...
}
重启 Nginx 后,您的通配符域名即可启用 HTTPS。
通过以上步骤,您可以轻松为自己的通配符域名生成 SSL 证书并应用到生产环境。
根据本人的实际情况
1、使用私钥签发根 CA 自签名证书
openssl req -x509 -new -nodes -key JJS_CA.key -sha256 -days 3650 -out JJS_CA.crt \
-subj "/C=CN/ST=Beijing/L=Beijing/O=JJS/OU=CA/CN=JJS_CA"
2、生成证书的脚本:
#!/bin/bash
# 配置参数
DOMAIN="*.ljjj.net" # 泛域名
ROOT_CA_KEY="JJS_CA.key" # 根 CA 私钥
ROOT_CA_CERT="JJS_CA.crt" # 根 CA 证书
CERT_DAYS=365 # 证书有效期
OUTPUT_DIR="./certs" # 输出目录
# 创建输出目录
mkdir -p "$OUTPUT_DIR"
# 步骤 1:生成域名私钥和 CSR
echo "生成域名私钥和 CSR..."
openssl req -new -newkey rsa:2048 -nodes -keyout "${OUTPUT_DIR}/${DOMAIN}.key" -out "${OUTPUT_DIR}/${DOMAIN}.csr" \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/OU=IT/CN=${DOMAIN}"
# 步骤 2:签发泛域名证书
echo "签发泛域名证书..."
openssl x509 -req -in "${OUTPUT_DIR}/${DOMAIN}.csr" -CA "$ROOT_CA_CERT" -CAkey "$ROOT_CA_KEY" -CAcreateserial \
-out "${OUTPUT_DIR}/${DOMAIN}.crt" -days "$CERT_DAYS" -sha256 \
-extensions v3_req -extfile <(echo "
[ v3_req ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = ${DOMAIN}
DNS.2 = example.com
")
# 步骤 3:合并证书链(适配 Nginx 的格式)
echo "合并证书链..."
cat "${OUTPUT_DIR}/${DOMAIN}.crt" "$ROOT_CA_CERT" > "${OUTPUT_DIR}/${DOMAIN}.pem"
# 步骤 4:验证生成的证书
echo "验证生成的证书..."
openssl verify -CAfile "$ROOT_CA_CERT" "${OUTPUT_DIR}/${DOMAIN}.crt"
echo "证书生成完成!保存路径:${OUTPUT_DIR}"
echo "域名证书和链: ${OUTPUT_DIR}/${DOMAIN}.pem"
echo "域名私钥: ${OUTPUT_DIR}/${DOMAIN}.key"