零成本拿下 HTTPS:Nginx 证书申请与自动续期

零成本拿下 HTTPS:Nginx 证书申请与自动续期

Let's Encrypt 教程Nginx HTTPS 配置certbot 自动续期免费 SSL 证书
📶 入门 🧩 Nginx · Certbot

零成本拿下 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 插件指南