一份精确的分步指南,教你在 Nginx 上使用 Certbot 为站点配置免费的 Let's Encrypt SSL 证书,包括通过 systemd 实现可靠的自动续期,适用于托管在沙特阿拉伯的服务器。
为什么选择 Let's Encrypt 免费 SSL
每一个公开的网站都需要 HTTPS。浏览器会将纯 HTTP 页面标记为“不安全”,搜索引擎更青睐加密站点,而沙特 PDPL 框架下的数据保护要求也将对传输中的流量进行加密列为基本要求。Let's Encrypt 是一家免费、自动化的非营利证书颁发机构,受到所有主流浏览器的信任。配合官方 ACME 客户端 Certbot,你可以零成本、零手动操作地签发和续期证书。
本指南将介绍如何在 Nginx(Ubuntu/Debian)上安装证书、验证证书,以及——最为重要的——配置不会出错的续期机制。续期部分比以往任何时候都更为关键:Let's Encrypt 证书的有效期历来为 90 天,而整个行业正在转向更短的有效期(45 天的证书配置已于 2026 年开始逐步推出)。手动续期已不再现实,因此自动化是必须的。
如果你在 Skyline Cloud 的 VPS 或云服务器上托管站点,并将其部署在沙特王国境内,下面的步骤可以在你的境内服务器上原样运行,让你的数据和 TLS 终端都保留在沙特本土。
前置条件
- 一台运行 Ubuntu 22.04/24.04 或 Debian 的云服务器或 VPS,并具备
sudo权限。 - 一个域名(例如
example.com),其 DNS A 记录指向服务器的公网 IP。如果你通过 Skyline 的托管 DNS 管理域名,请在那里添加该记录并等待其生效。 - 已安装 Nginx,并在 80 端口上为你的站点提供服务。
- 防火墙和任何云安全组中均已开放 80 和 443 端口。
在继续之前,请先验证 DNS 是否解析到你的服务器:
dig +short example.com
返回的 IP 必须与服务器的公网 IP 一致,否则域名验证将会失败。
第 1 步 — 安装 Certbot
推荐的方法是使用 snap 包,它由 EFF 维护并保持更新:
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
在没有 snap 的发行版上,APT 包同样可用:
sudo apt update
sudo apt install certbot python3-certbot-nginx
两种方式都包含下文所用的 Nginx 插件。
第 2 步 — 签发证书
Nginx 插件会一步到位地获取证书并编辑你的 server 块以启用 HTTPS:
sudo certbot --nginx -d example.com -d www.example.com
Certbot 会提示你输入邮箱地址(用于到期提醒和账户恢复),并要求你同意 ACME 服务条款。当它询问是否将 HTTP 重定向到 HTTPS 时,请选择 Redirect(重定向),这样所有流量都会被加密。
在幕后,Certbot 使用 HTTP-01 验证:它会在 /.well-known/acme-challenge/ 下放置一个令牌,Let's Encrypt 通过 80 端口获取该令牌,以证明你拥有对该域名的控制权。
替代方案:webroot(不修改 Nginx 配置)
如果你不希望 Certbot 改动你的配置——当你的 TLS 设置由模板生成或统一管理时这很常见——可以使用 webroot 方式仅获取证书:
sudo certbot certonly --webroot -w /var/www/html -d example.com -d www.example.com
然后你需要在 Nginx 的 server 块中自行引用这些文件:
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
务必让 Nginx 指向 live/ 路径,切勿指向带日期的 archive/ 文件——live/ 符号链接会在每次续期时更新。
第 3 步 — 验证 HTTPS 是否生效
重新加载 Nginx 并打开你的站点:
sudo nginx -t && sudo systemctl reload nginx
访问 https://example.com,你应当能看到锁形图标。通过命令行确认证书及其证书链:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -issuer -dates
这会打印出签发者(Let's Encrypt)以及有效期范围。
第 4 步 — 配置自动续期
正是这一步能避免凌晨 3 点的服务中断。Certbot 是根据证书剩余有效期来续期的,而非固定的时间表,因此频繁运行续期检查是安全的——也是设计初衷。
大多数安装已经会创建续期任务。检查一下:
systemctl list-timers | grep certbot
如果你看到 certbot.timer,说明自动续期已经启用。默认情况下,它每天运行两次,并带有随机延迟,以分散 Let's Encrypt 服务器的负载。每天运行两次是 EFF 自己的推荐做法,足以从容应对 90 天以及更短的 45 天证书。
在不实际签发的情况下测试续期
请务必通过演练(dry run)端到端确认续期流程是否畅通,它会针对 staging 环境模拟续期:
sudo certbot renew --dry-run
演练成功意味着真实的续期也会成功。
续期后重新加载 Nginx
续期后的证书只有在 Nginx 重新加载后才会被实际提供。添加一个部署钩子(deploy hook),让每次续期时都自动完成重载:
sudo certbot renew --deploy-hook "systemctl reload nginx"
Certbot 会将此钩子保存到证书的续期配置中,因此后续的自动续期都会为你重新加载 Nginx。重载是平滑进行的,对在线连接的影响几乎为零。
如果不存在 timer(手动 cron)
在极少数没有预配置 timer 的系统上,可以添加一条 cron 任务,每天运行两次检查,并带有随机休眠时间:
echo "0 0,12 * * * root sleep $((RANDOM \% 3600)) && certbot renew -q --deploy-hook 'systemctl reload nginx'" | sudo tee /etc/cron.d/certbot
续期方式一览
| 方式 | 适用场景 | 是否重载 Nginx |
|---|---|---|
certbot.timer(systemd) |
大多数系统的默认方式;推荐 | 通过部署钩子 |
/etc/cron.d/certbot |
没有 systemd timer 的系统 | 通过部署钩子 |
手动 certbot renew |
仅用于一次性操作 / 故障排查 | 需添加 --deploy-hook |
故障排查
- 验证失败 / 超时: 在签发期间,80 端口必须可从互联网访问。请检查你的防火墙和云安全组。
- DNS 不匹配: 重新运行
dig +short example.com,确认其与服务器 IP 一致。DNS 变更后请预留生效(传播)时间。 - 触发速率限制: Let's Encrypt 对每个域名每周可签发的证书数量有限制。测试时请使用
--dry-run,以免耗尽你的配额。 - 提供了错误的路径: 确保 Nginx 引用的是
/etc/letsencrypt/live/...,而不是archive/。
总结
现在,你已经在 Nginx 上拥有了一张免费、受浏览器信任的 SSL 证书,其续期可无人值守地自动运行,并会自动重新加载你的 Web 服务器——无论是 90 天还是更新的更短证书有效期都能从容应对。对于邮件而言,同样的原则也适用:安全的邮件传输同样重要,而 Skyline 企业邮箱托管 已为你预先配置好 TLS。想要更深入地了解证书、证书链与合规性,请参阅我们的 SSL 证书资源中心。
准备好在一台快速、符合 PDPL 合规、位于王国境内并提供本地阿拉伯语支持的服务器上运行这一切了吗?创建你的 Skyline Cloud 账户,今天就部署一个安全的站点吧。
Comments
0 total · 0 threads