申请部署SSL证书,首先生成私钥,然后使用私钥生成CSR,下面我将详细指导您使用OpenSSL生成CSR和私钥的完整步骤。以下是清晰的逐步流程:
准备工作
首先,确保系统已安装OpenSSL:
bash
openssl version
方法一:交互式生成(推荐新手)
步骤1:生成私钥
bash
生成2048位RSA私钥(无密码保护)
openssl genrsa -out example.com.key 2048
或者生成4096位(更安全,但性能略低)
openssl genrsa -out example.com.key 4096
生成带密码保护的私钥(推荐用于生产环境)
openssl genrsa -aes256 -out example.com.encrypted.key 2048
系统会提示输入并确认密码
步骤2:生成CSR(证书签名请求)
bash
openssl req -new -key example.com.key -out example.com.csr
系统会提示输入以下信息:
Country Name (2 letter code) [US]:国家代码(如CN、US)
State or Province Name (full name) []:州/省(如Beijing、California)
Locality Name (eg, city) []:城市(如Beijing、San Francisco)
Organization Name (eg, company) []:组织名称(公司名)
Organizational Unit Name (eg, section) []:部门名称(如IT Department)
Common Name (e.g. server FQDN or YOUR name) []:重要:要保护的域名
单域名:example.com
通配符:*.example.com
子域:www.example.com
Email Address []:管理员邮箱
Challenge password []:通常留空
Optional company name []:通常留空
步骤3:验证CSR内容
bash
查看CSR的详细信息
openssl req -in example.com.csr -noout -text
查看CSR中的公钥
openssl req -in example.com.csr -noout -pubkey
方法二:非交互式生成(适合自动化)
使用配置文件(推荐)
创建配置文件 csr_config.cnf:
ini
[req]
default_bits = 2048
default_keyfile = example.com.key
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
countryName = CN
stateOrProvinceName = Beijing
localityName = Beijing
organizationName = Example Inc.
organizationalUnitName = IT Department
commonName = *.example.com
emailAddress = admin@example.com
[v3_req]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = example.com
DNS.2 = *.example.com
如果需要更多域名,继续添加
DNS.3 = www.example.com
DNS.4 = mail.example.com
生成私钥和CSR:
bash
一步生成私钥和CSR
openssl req -new -nodes -sha256 -newkey rsa:2048 \
-config csr_config.cnf \
-keyout example.com.key \
-out example.com.csr
或者先有私钥,再生成CSR
openssl genrsa -out example.com.key 2048
openssl req -new -key example.com.key -config csr_config.cnf -out example.com.csr
方法三:生成通配符证书CSR的特定示例
仅通配符(不包含根域名)
bash
创建配置文件 wildcard.cnf
cat > wildcard.cnf << EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[dn]
C = CN
ST = Shanghai
L = Shanghai
O = "My Company"
OU = IT
CN = *.example.com
emailAddress = ssl-admin@example.com
EOF
生成
openssl req -new -newkey rsa:2048 -nodes \
-config wildcard.cnf \
-keyout wildcard.key \
-out wildcard.csr
通配符 + 根域名(使用SAN扩展)
bash
cat > wildcard_with_san.cnf << EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = req_ext
[dn]
C = US
ST = California
L = San Francisco
O = "My Company"
OU = DevOps
CN = *.example.com
emailAddress = ssl-admin@example.com
[req_ext]
subjectAltName = @alt_names
[alt_names]
DNS.1 = example.com
DNS.2 = *.example.com
EOF
生成
openssl req -new -newkey rsa:2048 -nodes \
-config wildcard_with_san.cnf \
-keyout wildcard_san.key \
-out wildcard_san.csr
验证生成的文件
检查私钥
bash
查看私钥信息
openssl rsa -in example.com.key -check -noout
如果私钥有密码,查看时需要输入密码
openssl rsa -in example.com.encrypted.key -check -noout
检查CSR
bash
查看CSR所有信息
openssl req -in example.com.csr -noout -text
仅查看主题信息
openssl req -in example.com.csr -noout -subject
检查SAN扩展(如果有)
openssl req -in example.com.csr -noout -text | grep -A 1 "Subject Alternative Name"
验证私钥和CSR匹配
bash
比较公钥哈希值
openssl rsa -in example.com.key -pubout -outform pem | sha256sum
openssl req -in example.com.csr -pubkey -noout | sha256sum
两个哈希值应该相同
最佳实践和安全建议
1. 密钥管理
bash
设置正确的权限
chmod 600 example.com.key # 仅所有者可读写
chmod 644 example.com.csr # 所有者可读写,其他人只读
备份私钥(安全存储!)
cp example.com.key backup/example.com.key.$(date +%Y%m%d)
2. 常用OpenSSL命令参考
bash
从现有私钥生成CSR(如果已有关键文件)
openssl req -new -key existing.key -out new.csr
查看CSR的Base64编码(用于CA提交)
cat example.com.csr
生成自签名证书(用于测试)
openssl x509 -req -days 365 -in example.com.csr \
-signkey example.com.key -out example.com.crt
3. 错误处理
bash
如果遇到"unable to load Private Key"错误
检查密钥文件格式
file example.com.key
转换PEM格式
openssl rsa -in old.key -out new.key
如果忘记私钥密码(只能重新生成)
无法恢复,需要生成新的密钥对
快速脚本示例
自动化生成脚本 generate_csr.sh
bash
!/bin/bash
DOMAIN=$1
if [ -z "$DOMAIN" ]; then
echo "用法: $0 域名"
echo "示例: $0 example.com"
exit 1
fi
创建目录
mkdir -p ssl/${DOMAIN}
cd ssl/${DOMAIN}
生成配置文件
cat > csr.cnf << EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[dn]
C = CN
ST = Beijing
L = Beijing
O = "My Company"
OU = IT
CN = *.${DOMAIN}
emailAddress = admin@${DOMAIN}
EOF
生成私钥和CSR
openssl req -new -newkey rsa:2048 -nodes \
-config csr.cnf \
-keyout ${DOMAIN}.key \
-out ${DOMAIN}.csr
echo "生成完成!"
echo "私钥: ${DOMAIN}.key"
echo "CSR: ${DOMAIN}.csr"
echo ""
echo "CSR内容:"
cat ${DOMAIN}.csr
使用方式:
bash
chmod +x generate_csr.sh
./generate_csr.sh example.com
提交给CA的后续步骤
将CSR内容复制给证书颁发机构(CA):
bash
cat example.com.csr
保存好私钥文件,不要分享给任何人
CA颁发证书后,您将收到一个或多个.crt文件,与私钥一起部署到服务器
最后要让用户记住:永远不要丢失私钥,否则对应的SSL证书将无法使用。建议将私钥存储在安全的密钥管理系统中。