在腾讯云服务器上部署 Nginx 网站,可以使用 Let’s Encrypt 免费证书,并通过 Certbot 自动申请、配置 HTTPS 和续期。本文以 OpenCloudOS 8.6 为例,直接使用已有 Nginx 网站完成域名验证,无需接入 CDN,也不需要停掉网站。

文中的 example.com、www.example.com 和 app.example.com 均为示例域名,执行命令前请替换为自己的域名。命令按 root 用户编写,普通用户需按权限添加 sudo。

一、证书和工具分别负责什么

Let’s Encrypt 是由非营利组织 ISRG 运营的证书颁发机构,负责验证域名控制权并免费签发 TLS 证书;Certbot 则是免费的开源客户端,负责向证书机构申请证书、安装到 Web 服务器,以及执行续期。两者配合,完成证书管理的自动化。

免费的是证书申请与续期,服务器和域名仍有各自的费用。证书本身有有效期,自动续期让网站能够持续使用有效证书。免费服务以官方现行政策为准,不宜将其理解为对未来政策永不变化的承诺。参见 Let’s Encrypt 官方介绍。

二、准备域名和网络环境

本教程适用于直接安装在服务器上的 Nginx。开始前,确认已有 HTTP 网站能够通过域名访问,且 Nginx 的 server_name 包含准备申请证书的域名。

  • 所有申请域名的 A 记录指向服务器公网 IPv4 地址。

  • 如果配置了 AAAA 记录,对应 IPv6 地址也必须可访问。

  • 腾讯云安全组和服务器防火墙放行 TCP 80、443 端口。

  • 服务器可以访问 Let’s Encrypt 的 ACME 服务。

80 端口用于本方案的 HTTP-01 域名验证,443 端口用于网站 HTTPS。已有 HTTP 跳转 HTTPS 的配置可以保留,Nginx 插件会在验证期间处理所需配置。泛域名证书需要 DNS 验证,不适用本文的签发命令。验证规则见 Let’s Encrypt 验证方式说明。

三、安装 Certbot 和 Nginx 插件

dnf install -y epel-release
dnf install -y certbot python3-certbot-nginx

OpenCloudOS 8 可通过 EPEL 补充软件包,具体取决于服务器已启用的软件源。参考 OpenCloudOS 官方常见问题。

确认 Nginx 插件已被识别:

certbot plugins

输出中应包含 nginx。接着备份现有配置,并检查 Nginx:

cp -a /etc/nginx "/etc/nginx.backup-$(date +%Y%m%d-%H%M%S)"
nginx -t

四、直接用已有 Nginx 网站申请证书

检查通过后,执行以下命令,为多个域名申请一张证书:

certbot --nginx \
  --cert-name example.com \
  -d example.com \
  -d www.example.com \
  -d app.example.com

按提示填写联系邮箱、同意服务条款,并根据网站需要选择是否将 HTTP 跳转到 HTTPS。

--nginx 表示使用 Nginx 插件完成验证与安装;每个 -d 指定一个要包含的域名;--cert-name 指定 Certbot 内部管理这张证书的名称。只填写实际使用、已正确解析的域名,所有域名都需要通过验证。

同一张多域名证书可以供多个 Nginx 站点使用。新增域名时需要重新签发包含该域名的证书,普通多域名证书不会自动覆盖未列出的子域名。

五、检查 Nginx 证书配置

签发成功后查看证书信息:

certbot certificates

重点检查域名列表、到期时间和实际证书路径。证书名为 example.com 时,路径通常如下,以命令输出为准:

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

Certbot 会更新匹配站点的证书配置。已有业务的反向代理、静态目录和访问控制应保留,无需为了更换证书重写整份 Nginx 配置。

HTTP 跳转可以整理为一个简单的 server 块:

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com app.example.com;

    return 301 https://$host$request_uri;
}

如果原配置已经有对应的 HTTP 块,直接整理原块,不要重复添加。完成后检查并平滑重载:

nginx -t && nginx -s reload

随后通过浏览器访问各域名,确认 HTTPS 正常,并检查浏览器展示的证书是否覆盖该域名。

六、验证自动续期

执行模拟续期:

certbot renew --dry-run

看到所有模拟续期成功的提示,说明当前配置能够完成续期验证。它使用测试环境,不会替换线上证书,也不等于已经启用了定时任务。

继续检查定时器:

systemctl list-unit-files '*certbot*'
systemctl list-timers --all '*certbot*'

如果安装包提供的是 certbot-renew.timer,启用它:

systemctl enable --now certbot-renew.timer

部分安装方式使用 certbot.timer,应以实际查询到的名称为准。只需启用对应的一个定时器,无需再叠加 cron 任务。

再次查看定时器,确认 NEXT 显示下次执行时间。首次运行前 LAST 显示 n/a 属于正常情况。定时器负责周期性检查,证书到达续期条件后才实际更新。

通过 certbot --nginx 完成安装的证书,续期时会复用 Nginx 插件,并重载 Nginx 使新证书生效。具体说明见 Certbot 自动续期文档。

七、日常维护

保持域名解析正确、80 端口可访问,并保留 Certbot 的续期配置。更换域名、调整 Nginx 或修改网络规则后,重新执行一次模拟续期,确认验证入口仍然可用。

需要查看自动任务执行记录时,可以运行:

journalctl -u certbot-renew.service --no-pager -n 50

服务名与定时器对应;如果使用的是 certbot.timer,则查看 certbot.service。Certbot 的详细日志默认位于 /var/log/letsencrypt/letsencrypt.log。

完成证书签发、Nginx 配置检查、模拟续期和定时器确认后,后续证书更新即可交由 Certbot 管理。