零成本拿下 HTTPS:Nginx 证书申请与自动续期
HTTPS 早就不是可选项。浏览器会对 HTTP 页面直接打上刺眼的红锁。微信生态也会拦截明文链接,没有 HTTPS 的网站等同于拒绝访问。Let’s Encrypt 作为开放的证书颁发机构,让你零成本搞定这一切。在 Ubuntu 24.04 系统下,跑通 Nginx 的证书申请、配置注入与自动续期全流程十分简单。
部署前要知道的 3 件事
在敲下任何命令前,服务器必须满足三个前置条件,缺少一项都会导致验证失败。
第一,域名解析已生效。你需要拥有一个公网域名(本文以 example.com 为例),并且在 DNS 控制台将 A 记录准确指向当前服务器的公网 IP。如果启用了 CDN,验证期间需要先将其调整为回源模式。
第二,端口放行无阻拦。Let’s Encrypt 的 HTTP-01 挑战强依赖外部可达的 80 端口。不仅要在 Ubuntu 系统的 UFW 防火墙中放行,云厂商控制台的安全组也必须同步开放 80(HTTP)和 443(HTTPS)端口。
第三,Nginx 基础配置就绪。Nginx 必须已经跑在服务器上,并且针对你的域名配置好了 HTTP 监听块。Certbot 依靠扫描这些配置文件来接管 HTTPS 改造。
安装与验证:Certbot 自动接管
在 Ubuntu 24.04 LTS 环境下,官方提供 Snap 和 APT 两种安装途径。直接使用 APT 安装 Certbot 及其专用的 Nginx 插件是一条捷径,这套组合能自动分析现有配置,省去手动拼接路径的麻烦。
sudo apt update
sudo apt install certbot python3-certbot-nginx
安装完成后,打开你已有的 Nginx 配置文件(如 /etc/nginx/sites-available/example.com),确保 server_name 指令精确匹配你的域名,而不是留空或写着 _。
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
}
确认无误后,测试语法并重载 Nginx,让配置生效。
sudo nginx -t
sudo systemctl reload nginx
如果服务器开启了 UFW 防火墙,此时需要调整规则,放行 Nginx 的完整网络流量,并清理掉单纯的 HTTP 规则。
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'
申请证书:一行命令完成 HTTPS 改造
运行带有 Nginx 插件的 Certbot,它会自动完成域名控制权验证、证书下载和配置文件的安全注入。
sudo certbot --nginx -d example.com -d www.example.com
执行期间,Certbot 会询问是否将 HTTP 流量自动重定向到 HTTPS。选择 Redirect 即可,所有访问从此强制走加密通道。执行完毕后,证书存放在 /etc/letsencrypt/live/example.com/ 目录下。Certbot 还会自动把你的 Nginx 配置改写成双监听模式。
原来单一的 80 端口块会被注入 301 重定向,并新增一个 443 端口块,里面填满了 ssl_certificate 和安全参数。
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
root /var/www/example.com;
index index.html;
}
为了进一步收紧安全策略,可以在 Nginx 配置中手动添加 HSTS 头,告诉浏览器未来只能用 HTTPS 连接该域名。
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
验证方式对比与低配可行性
Certbot 支持不同的挑战模式,主要区分在你的网络架构。
| 验证模式 | 依赖条件 | 适用场景 |
|---|---|---|
| HTTP-01 验证 | 必须开放 80 端口 | 绝大多数单域名、普通云主机部署 |
| DNS-01 验证 | 需要修改域名 TXT 记录 | 申请泛域名证书、内网服务器或 80 端口封禁 |
在资源消耗方面,Certbot 的运行十分轻量。最入门的机型也能无压力地跑满这套 HTTPS 流程。参考云资源数据(价格查询于 2026-10-02),一台最低 ¥38/年 的 2核2G 云服务器就能完美支撑带有自动 HTTPS 续期的 Nginx 站点,性能瓶颈不会出现在证书模块。
自动续期:把运维交给系统
Let’s Encrypt 签发的证书有效期仅有 90 天,短周期强制推动了自动化。使用 APT 安装 Certbot 后,系统会自动注册 certbot.timer 定时任务。它每天运行两次,扫描并为剩余有效期不足 30 天的证书执行续期,并在成功后重载 Nginx。
你可以执行模拟运行,提前验证续期链路是否通畅。
sudo certbot renew --dry-run
如果输出没有报错,整个 HTTPS 生命周期管理就实现了自动化,无需人工干预。
常见问题(FAQ)
证书续期失败怎么办?
首要排查 80 端口是否被意外封堵。HTTP-01 验证强依赖 80 端口可达,如果中途修改了防火墙规则或套用了严苛的 CDN 防御策略,会导致 Certbot 无法完成校验,证书就会过期断供。
泛域名证书要不要 DNS 验证?
必须用。如果你需要为 *.example.com 申请泛域名证书,标准的 HTTP-01 验证无法满足,只能改用 DNS-01 挑战,通过 API 自动添加 TXT 记录来证明域名所有权。
80 端口被占还能申请吗?
如果是被不可控的业务强占,HTTP-01 会直接失败。你可以通过 Nginx 反代把 /.well-known/acme-challenge/ 路径专属转发给 Certbot 本地临时端口,或者干脆切换到 DNS-01 验证绕开端口限制。
参考链接:
- Let’s Encrypt 官方文档
- Certbot Nginx 插件指南