Let's Encrypt 免费 SSL 证书申请与自动续期全攻略:ACME 协议 + certbot 一键让网站挂上 HTTPS


一、为什么你的网站需要 HTTPS

打开浏览器访问一个没有证书的网站,地址栏会显示"不安全"。尤其是做外贸独立站、跨境电商、海外项目的站点,访问者多为海外用户,浏览器对 HTTP 站点的拦截越来越严格。HTTP 是明文传输,账号密码、订单信息、支付数据都可能在网络中被打包窃听。而 HTTPS 通过 SSL/TLS 证书把传输内容加密,同时向访问者证明"这个域名确实是你的"。

好消息是,一年几百上千块的商业证书早已不是唯一选择。Let's Encrypt 提供完全免费、全球信任、每 90 天自动续期的 SSL 证书,配合自动化工具 certbot,可以在几十秒内让 Nginx、Apache 站点全部挂上 HTTPS。

二、Let's Encrypt 与 ACME 协议是怎么工作的

Let's Encrypt 的核心是 ACME(Automatic Certificate Management Environment)协议。流程大致是:

  1. 客户端(如 certbot)向证书颁发机构发起申请,并携带 Nonce 随机数做防重放保护。
  2. 证书颁发机构验证"你确实拥有这个域名",常见验证方式有 HTTP-01(在域名下临时放一个 token 文件)、DNS-01(在 DNS 加一条 TXT 记录)和 TLS-ALPN-01。
  3. 验证通过后签发证书,有效期 90 天。
  4. 到期前,客户端在服务器上用 ACME 续期并自动替换证书。

因为 HTTP-01 验证只需在 80 端口临时放文件,绝大多数 Nginx 站点都适合用这种最简单的方式。

三、准备环境:安装 certbot

certbot 是 Let's Encrypt 官方推荐的客户端。不同系统安装方式略有差异:

# Ubuntu / Debian
sudo apt update
sudo apt install -y certbot python3-certbot-nginx

# CentOS 7
sudo yum install -y epel-release
sudo yum install -y certbot python2-certbot-nginx

# CentOS 8+ / Rocky / AlmaLinux
sudo dnf install -y certbot python3-certbot-nginx

安装后确认版本:

certbot --version

如果提示 python3-certbot-nginx 找不到,通常说明系统源缺包,可先只装 certbot,用后面的 webroot 方式验证,不依赖 Nginx 插件。

四、一行命令签发证书

签发前请确保域名已经通过 A 记录解析到当前服务器公网 IP 且 DNS 已生效。建议先放行 80 端口,避免验证被防火墙拦截。

4.1 使用 Nginx 插件(推荐)

服务器已用 Nginx 托管该域名时,直接让 certbot 自动改写配置:

sudo certbot --nginx -d www.example.com -d example.com

certbot 会自动生成 443 server 块、证书路径,结束时询问是否把 HTTP 请求 301 跳转到 HTTPS,选择跳转即可。

4.2 使用 webroot 方式

不想让 certbot 改动 Nginx 配置时,只验证 http://域名/.well-known/acme-challenge/ 下的临时文件。确认配置里有这条 location:

location ^~ /.well-known/acme-challenge/ {
    default_type "text/plain";
    root /var/www/html;
}

然后签发:

sudo certbot certonly --webroot -w /var/www/html -d www.example.com

签发成功后会提示证书路径,一般是 /etc/letsencrypt/live/www.example.com/fullchain.pem 和 privkey.pem。

五、Nginx 配置 HTTPS 与强制跳转

拿到证书后,配置一个 443 server 块:

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name www.example.com;

    ssl_certificate     /etc/letsencrypt/live/www.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    root /var/www/html;
    index index.html;
}

再补一个 HTTP 强制跳转到 HTTPS 的监听,避免留下明文入口:

server {
    listen 80;
    server_name www.example.com;
    return 301 https://$host$request_uri;
}

改完先做语法检查,无误后再 reload,避免把站点弄挂:

sudo nginx -t
sudo systemctl reload nginx

六、证书自动续期配置

Let's Encrypt 证书只有 90 天,手动续期不现实,自动续期是必须的。certbot 安装时会自动创建 renew 用的 systemd timer,到期自动触发续期并 reload Nginx,通常无需再管。

但建议先做一次续期演练,确认链路畅通:

sudo certbot renew --dry-run

证书只有剩 30 天内才会真正续期,dry-run 正是验证"会不会续"的稳妥手段。若系统较老、没有 systemd,可把续期命令写进 crontab,每天凌晨执行:

0 3 * * * /usr/bin/certbot renew --quiet && /bin/systemctl reload nginx

续期成功后证书路径不变(/etc/letsencrypt/live/ 下的符号链接自动更新),Nginx 配置一行都不用改。

七、常见问题与排错

  • 失败 403 无法访问 /.well-known/acme-challenge/:通常是 80 端口被防火墙(ufw / firewalld / 云厂商安全组)拦截,或 Nginx location 冲突。先放行 80,再确保没有其他 location 把请求截走。
  • 证书没有自动续期:运行 systemctl status certbot.timer 查看定时器;很多 VPS 因时间不准(ntp 未同步)导致 ACME 验证失败,先 timedatectl set-ntp true 校准时间。
  • 多域名证书:用 -d 重复追加即可,但单张证书最多 100 个域名。
  • 续期失败想立即重试:先 certbot renew --force-renewal 强制续期,再查 /var/log/letsencrypt/letsencrypt.log 里的具体报错。

写在最后

给 Nginx 站点挂 HTTPS,本质上就是"申请证书 + 配置 443 + 自动续期"三步。用 certbot + Let's Encrypt,全程免费、续期自动化,外贸站和普通博客都能在十几分钟内完成,彻底告别浏览器上的"不安全"红色警告。把证书文件放到独立目录、做好权限管理,再配合 certbot renew --dry-run 定期验证续期链路,你的站点 HTTPS 就能长期稳定运行。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

Linux Swap 虚拟内存配置详解:swap 文件/分区、swappiness 调优,低配 VPS 告别 OOM

Linux服务器安全加固教程:SSH安全、防火墙、fail2ban 防暴力破解全攻略

评 论
更换验证码