如下阐述为在CentOS系统中申请并配置Let’s Encrypt免费HTTPS证书的具体方法和完整步骤,适配Nginx服务器。
前置准备
- 确认你的域名已解析到服务器公网 IP(A/AAAA 记录)
- 开放服务器 80/443 端口(HTTP-01 验证依赖 80 端口):
# CentOS 7(firewalld) sudo firewall-cmd --permanent --add-port=80/tcp --add-port=443/tcp sudo firewall-cmd --reload # CentOS 8/9(firewalld) sudo firewall-cmd --permanent --add-service=http --add-service=https sudo firewall-cmd --reload - 确保Nginx服务器已安装并正常运行
安装Certbot
Certbot是Let’s Encrypt官方推荐的客户端,不同CentOS版本安装方式略有差异:
CentOS 7
# 安装EPEL源(CentOS 7必须) sudo yum install -y epel-release # 安装Certbot及对应Web服务器插件 # Nginx用户 sudo yum install -y certbot python2-certbot-nginxCentOS 8/9
# 安装EPEL源 sudo dnf install -y epel-release # 启用PowerTools仓库(CentOS 8)/ CRB仓库(CentOS 9) sudo dnf config-manager --set-enabled powertools # CentOS 8 sudo dnf config-manager --set-enabled crb # CentOS 9 # 安装Certbot及插件 # Nginx用户 sudo dnf install -y certbot python3-certbot-nginx
申请并配置泛域名证书
使用泛域名的好处是可以针对不同的子系统配置相应的域名,如:wiki.example.com,blog.example.com。
Let’s Encrypt 完全支持免费的泛域名证书(Wildcard Certificate,如*.example.com),但有两个关键限制:必须通过DNS-01 验证方式申请,且需使用ACME v2 协议(目前所有主流客户端如 Certbot 均已支持)。
一张泛域名证书可保护主域名下所有一级子域名(如*.example.com可保护blog.example.com、shop.example.com等),但不包含主域名本身(需单独添加-d example.com)。
如下采用自动 DNS 验证的方式,使用Certbot完成证书申请 + Web服务器配置 + 自动续期配置。
步骤 1:安装 DNS 插件(以阿里云为例,域名在阿里云万网解析)
# 1. 安装Python pip(CentOS)
sudo yum install -y python3-pip
# 2. 安装阿里云DNS插件
sudo pip3 install certbot-dns-aliyun
# 若安装失败,可升级pip后重试
sudo pip3 install --upgrade pip
sudo pip3 install certbot-dns-aliyun
步骤 2:创建阿里云 API 密钥配置文件
Certbot 需要通过阿里云 API 自动管理 DNS 记录,需先创建 API 密钥(AccessKey):
登录阿里云控制台 → 头像 → AccessKey 管理 → 创建 AccessKey(需完成实名认证);
记录AccessKey ID和AccessKey Secret(务必保存好,泄露会导致域名被篡改);
创建密钥配置文件:
# 创建安全目录(仅root可访问) mkdir -p ~/.secrets/certbot chmod 700 ~/.secrets/certbot # 编辑配置文件 vim ~/.secrets/certbot/aliyun.ini在配置文件中添加以下内容(替换为你的实际密钥):
# aliyun.ini dns_aliyun_access_key = 你的阿里云AccessKey ID dns_aliyun_access_key_secret = 你的阿里云AccessKey Secret设置文件权限(关键,避免密钥泄露):
sudo chmod 600 ~/.secrets/certbot/aliyun.ini sudo chown root:root ~/.secrets/certbot/aliyun.ini
步骤 3:用自动 DNS 插件申请证书
# 申请证书(包含主域名+泛域名)
sudo certbot certonly --dns-aliyun --dns-aliyun-credentials ~/.secrets/certbot/aliyun.ini -d example.com -d *.example.com
执行后,Certbot 会:
- 自动通过阿里云 API 添加 TXT 验证记录;
- 验证通过后自动删除临时 TXT 记录;
- 证书保存路径为/etc/letsencrypt/live/example.com/。
证书默认路径:
/etc/letsencrypt/live/example.com/
├── fullchain.pem # 证书链(包含服务器证书和中间证书)
├── privkey.pem # 私钥文件
├── cert.pem # 服务器证书
└── chain.pem # 中间证书
编辑站点配置文件(如/etc/nginx/conf.d/example.conf):
server {
listen 443 ssl http2;
server_name example.com *.example.com;
# 证书配置
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# SSL优化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
# 网站根目录(替换为实际路径)
root /usr/share/nginx/html;
index index.html;
}
# 强制HTTP跳转HTTPS
server {
listen 80;
server_name example.com *.example.com;
return 301 https://$host$request_uri;
}
步骤 4:测试自动续期
# 模拟续期(无实际操作,仅测试)
sudo certbot renew --dry-run
如果输出All renewal attempts succeeded.,说明自动续期配置成功。
注: 务必用certbot renew --dry-run测试续期逻辑,确保无报错,避免证书过期。
步骤 5:配置证书自动续期
使用Linux 系统通用的定时任务工具cron配置证书自动续期:
# 打开root用户的crontab编辑界面
sudo crontab -e
# 每天凌晨3点自动执行Certbot续期,静默模式(仅出错时输出日志)
0 3 * * * /usr/bin/certbot renew --quiet --no-self-upgrade
0 3 * * *:表示每天凌晨 3 点执行(可自定义时间,如0 2 * * *是凌晨 2 点);/usr/bin/certbot:Certbot 的默认路径,若找不到可执行which certbot查看实际路径;--quiet:静默执行,避免无关输出;--no-self-upgrade:禁止 Certbot 自动升级,避免升级导致兼容性问题。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,在下面评论区告诉我^_^^_^