一、为什么你的网站需要 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)协议。流程大致是:
- 客户端(如 certbot)向证书颁发机构发起申请,并携带 Nonce 随机数做防重放保护。
- 证书颁发机构验证"你确实拥有这个域名",常见验证方式有 HTTP-01(在域名下临时放一个 token 文件)、DNS-01(在 DNS 加一条 TXT 记录)和 TLS-ALPN-01。
- 验证通过后签发证书,有效期 90 天。
- 到期前,客户端在服务器上用 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 就能长期稳定运行。
