在CentOS 7.9上生成Web SSL证书和密钥的详细指南
在CentOS 7.9上生成SSL证书和密钥可以通过OpenSSL工具完成。以下是详细的步骤说明:
- 安装OpenSSL 首先确保系统已安装OpenSSL:
sudo yum install openssl -y
检查安装版本:
openssl version
- 创建证书目录结构
sudo mkdir -p /etc/ssl/{certs,private}
sudo chmod -R 700 /etc/ssl/private
- 生成私钥
方法一:生成RSA私钥(2048位)
sudo openssl genrsa -out /etc/ssl/private/server.key 2048
参数说明:
genrsa - 生成RSA密钥
-out - 指定输出文件
2048 - 密钥位数(推荐至少2048位)
方法二:生成更安全的ECDSA私钥
sudo openssl ecparam -genkey -name secp384r1 -out /etc/ssl/private/server.key
参数说明: ecparam - 处理椭圆曲线参数
-genkey - 生成密钥
-name secp384r1 - 指定椭圆曲线名称
- 生成证书签名请求(CSR)
sudo openssl req -new -key /etc/ssl/private/server.key -out /etc/ssl/certs/server.csr
系统会提示输入以下信息:
Country Name (2 letter code) [XX]: CN
State or Province Name (full name) []: Beijing
Locality Name (eg, city) [Default City]: Beijing
Organization Name (eg, company) [Default Company Ltd]: YourCompany
Organizational Unit Name (eg, section) []: IT
Common Name (eg, your name or your server's hostname) []: yourdomain.com
Email Address []: admin@yourdomain.com
A challenge password []: (直接回车不设置)
An optional company name []: (直接回车不设置)
参数说明: req - 创建证书请求
-new - 新建请求
-key - 指定私钥文件
-out - 指定输出文件
- 生成自签名证书 对于测试环境,可以生成自签名证书:
sudo openssl x509 -req -days 365 -in /etc/ssl/certs/server.csr -signkey /etc/ssl/private/server.key -out /etc/ssl/certs/server.crt
参数说明: x509 - 指定X.509证书格式
-req - 输入是证书请求
-days 365 - 证书有效期(天)
-in - 输入CSR文件
-signkey - 自签名使用的私钥
-out - 输出证书文件
- (可选)生成更安全的证书配置
创建配置文件/etc/ssl/openssl.cnf:
sudo tee /etc/ssl/openssl.cnf <<'EOF
[ req ]
default_bits = 2048
default_keyfile = server-key.pem
distinguished_name = subject
req_extensions = req_ext
x509_extensions = x509_ext
string_mask = utf8only
[ subject ]
countryName = Country Name (2 letter code)
countryName_default = CN
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Beijing
localityName = Locality Name (eg, city)
localityName_default = Beijing
organizationName = Organization Name (eg, company)
organizationName_default = YourCompany
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = yourdomain.com
emailAddress = Email Address
emailAddress_default = admin@yourdomain.com
[ x509_ext ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
[ req_ext ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
[ alternate_names ]
DNS.1 = yourdomain.com
DNS.2 = www.yourdomain.com
DNS.3 = mail.yourdomain.com
EOF
然后使用配置文件生成证书:
sudo openssl req -config /etc/ssl/openssl.cnf -new -x509 -sha256 -newkey rsa:2048 -nodes -keyout /etc/ssl/private/server.key -days 365 -out /etc/ssl/certs/server.crt
- 设置文件权限
sudo chmod 600 /etc/ssl/private/server.key
sudo chmod 644 /etc/ssl/certs/server.crt
- 验证证书
openssl x509 -in /etc/ssl/certs/server.crt -text -noout
- (可选)生成PEM格式证书 某些应用需要PEM格式:
sudo cat /etc/ssl/certs/server.crt /etc/ssl/private/server.key > /etc/ssl/certs/server.pem
使用Let's Encrypt获取免费证书(生产环境推荐) 对于生产环境,建议使用Let's Encrypt免费证书:
安装certbot:
sudo yum install epel-release -y
sudo yum install certbot -y
获取证书(webroot方式):
sudo certbot certonly --webroot -w /var/www/html -d yourdomain.com -d www.yourdomain.com
自动续期测试:
sudo certbot renew --dry-run
Let's Encrypt证书每90天需要续期,可以设置cron任务自动续期。
详细介绍certbot -d *.baidu.com --manual --config-dir config --work-dir data --preferred-challenges dns certonly命令的作用和用到的参数和选项
这个 certbot 命令用于申请 通配符证书(Wildcard SSL Certificate)(*.baidu.com),并使用 DNS 手动验证(Manual DNS Challenge) 方式。下面详细解析这个命令的每个部分:
命令解析
certbot -d *.baidu.com --manual --config-dir config --work-dir data --preferred-challenges dns certonly
参数/选项 作用 详细说明
certbot Certbot 主命令 Let's Encrypt 的官方客户端工具
-d *.baidu.com 指定域名 申请 *.baidu.com 的通配符证书(适用于所有子域名)
--manual 手动模式 需要手动完成验证(DNS 或 HTTP 验证)
--config-dir config 指定配置目录 存放 Certbot 配置文件的目录(默认 /etc/letsencrypt)
--work-dir data 指定工作目录 存放 Certbot 运行时数据的目录(默认 /var/lib/letsencrypt)
--preferred-challenges dns 优先使用 DNS 验证 要求使用 DNS 方式验证域名所有权
certonly 仅获取证书,不自动安装 只生成证书,不修改 Web 服务器配置
关键参数详解
- -d .baidu.com(申请通配符证书) 通配符证书(.baidu.com)可以保护所有子域名(如 www.baidu.com、api.baidu.com)。
Let's Encrypt 通配符证书必须使用 DNS 验证(--preferred-challenges dns),不能使用 HTTP 验证。
- --manual(手动模式) 不会自动完成验证,而是提示你手动操作:
如果是 --preferred-challenges dns,会要求你添加 TXT 记录 到 DNS 解析。
如果是 --preferred-challenges http,会要求你在网站根目录放置验证文件。
适用于:
服务器无法自动配置 DNS(如 Cloudflare、阿里云 DNS 需要手动操作)。
自动化脚本无法访问 DNS 管理 API 的情况。
- --preferred-challenges dns(DNS 验证)
DNS 验证流程:
Certbot 会生成一个随机的 TXT 记录(如 _acme-challenge.baidu.com)。
你需要手动在 DNS 管理界面添加这条记录。
Certbot 会查询 DNS,确认记录存在后颁发证书。
适用场景:
通配符证书(*.example.com)必须使用 DNS 验证。
服务器没有开放 80/443 端口(无法使用 HTTP 验证)。
- --config-dir 和 --work-dir(自定义目录) 默认路径:
配置文件:/etc/letsencrypt
工作数据:/var/lib/letsencrypt
日志:/var/log/letsencrypt
自定义路径(如 --config-dir config --work-dir data):
适用于测试环境,避免影响系统默认配置。
证书文件会存放在 config/live/baidu.com/ 下。
- certonly(仅获取证书) 仅生成证书,不会自动配置 Nginx/Apache。
适用场景:
你希望手动部署证书。
使用非标准 Web 服务器(如 HAProxy、Caddy)。
测试环境,避免影响生产配置。
完整申请流程示例
- 运行命令
certbot -d *.baidu.com --manual --config-dir config --work-dir data --preferred-challenges dns certonly
- Certbot 会提示
Please deploy a DNS TXT record under the name:
_acme-challenge.baidu.com
with the following value:
Xsdfk234jklJKL34jkL3k4jKL34kLJ34
Before continuing, verify the record is deployed.
Press Enter to Continue
- 手动添加 DNS TXT 记录 登录你的 DNS 管理平台(如 Cloudflare、阿里云 DNS)。
添加一条 TXT 记录:
主机名:_acme-challenge.baidu.com
记录值:Xsdfk234jklJKL34jkL3k4jKL34kLJ34(Certbot 提供的随机值)
等待 DNS 生效(可用 dig TXT _acme-challenge.baidu.com 测试)。
- 按 Enter 继续 Certbot 会检查 DNS 记录,验证成功后生成证书:
Successfully received certificate.
Certificate is saved at: config/live/baidu.com/fullchain.pem
Key is saved at: config/live/baidu.com/privkey.pem
总结
--manual --preferred-challenges dns:适用于通配符证书,需手动添加 DNS TXT 记录。
-d *.baidu.com:申请 *.baidu.com 的通配符证书。
--config-dir 和 --work-dir:自定义配置目录,避免影响默认路径。
certonly:仅生成证书,不自动配置 Web 服务器。
如果是生产环境,建议使用 自动化 DNS API(如 Cloudflare、阿里云 DNS 插件)替代 --manual,以实现自动续期。