TL;DR:在 Ubuntu 上:先运行 sudo apt install certbot python3-certbot-nginx,再运行 sudo certbot --nginx -d yourdomain.com。certbot 会自动修改 nginx 配置,并每 60 天自动续期。证书免费,全面启用 TLS,全程仅需 5 分钟。
DNS 负责路由流量,HTTPS 负责加密传输。Let's Encrypt 是一个免费、自动化、受浏览器信任的证书颁发机构,近十年来一直是"在 Linux 服务器上配置 TLS"的默认答案。两条命令获取真实证书,一个定时任务让证书永久有效。
HTTPS 是任何面向公网的站点的最低门槛。浏览器对缺少 HTTPS 的网站会发出醒目警告——地址栏里一个大大的"不安全"标记,会瞬间摧毁你精心设计所建立的信任感。用户已经学会正确解读这个信号:一个在 2026 年仍然只有 HTTP 的网站,看上去要么坏掉了,要么被遗弃了,要么暗藏风险。没有任何理由发布这样的网站,反而有很多理由不这么做。
HTTPS 之所以让人觉得麻烦,是因为历史上你需要从 Comodo、DigiCert 等厂商购买 TLS 证书,价格从每年 50 到 500 美元不等,还要通过繁琐的邮件和 DNS 验证流程来证明域名所有权,最后再手动将证书安装到 Web 服务器。续期是一件你有时会忘记的日历事项,整个流程是一笔不小但真实存在的持续成本。
Let's Encrypt 彻底改变了这一切。它是由互联网安全研究组(ISRG,Mozilla、EFF、Cisco 等联合资助)运营的免费、自动化、受浏览器信任的证书颁发机构。其 ACME 协议允许服务器上的脚本在几秒内证明对域名的所有权,并获取 90 天有效期的证书。配套工具——通常是 certbot——自动化了证书的签发、安装和续期。最终结果是:HTTPS 开箱即用、零成本、自动续期。
配置 HTTPS 需要以下三个条件已经具备:
如果上述任一条件尚未满足,请先解决。否则 Let's Encrypt 会以令人困惑的方式失败。
两种合理的方案:
example.com { ... },Caddy 自动搞定证书。适合从零开始的新服务器。如果是全新服务器且没有 Nginx 历史包袱,Caddy 更简单。如果"Nginx 已经在跑,只是想加上 HTTPS",certbot 更合适。
# Install Caddy on Ubuntu
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | \
sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | \
sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install caddy
# Configure: edit /etc/caddy/Caddyfile
sudo nano /etc/caddy/Caddyfile
将文件内容替换为:
example.com {
reverse_proxy localhost:3000
# Or root * /var/www/html ; file_server for static files
}
重启 Caddy:sudo systemctl restart caddy。在收到第一个请求时,Caddy 会联系 Let's Encrypt,验证你的域名(DNS 必须已解析到此服务器),获取证书并提供 HTTPS 服务。之后会自动续期。
假设 Nginx 已在运行,且你已有 example.com 的 server block:
# Install certbot and the Nginx plugin
sudo apt install -y certbot python3-certbot-nginx
# Issue a cert and edit your Nginx config to use it
sudo certbot --nginx -d example.com -d www.example.com
certbot 会提示你输入邮箱(用于续期失败通知,不会用于其他用途)并同意 Let's Encrypt 服务条款。随后它会与 Let's Encrypt 通信,通过 HTTP-01 方式(在 /.well-known/acme-challenge/... 放置临时文件供 LE 服务器验证)验证域名所有权,获取证书,并自动修改 Nginx 配置以使用该证书。
测试 HTTPS 站点:curl -I https://example.com 应返回 200(或你的应用实际返回的状态码)。浏览器中的"不安全"标记消失。
*.example.com 必须使用 DNS-01)的情况。使用 certbot 进行 DNS-01 验证时,添加 --manual --preferred-challenges dns,或使用针对特定 DNS 服务商的插件(如 python3-certbot-dns-cloudflare 等)。
Caddy 和 certbot 均内置自动续期。证书有效期为 90 天;续期任务每天运行,并在证书到期前 30 天内自动续期。无需手动设置 cron 任务,软件包的 systemd 定时器已自动安装。
检查是否正常运行:
# For certbot:
sudo systemctl list-timers | grep certbot
sudo certbot renew --dry-run # simulates a renewal without changing anything
# For Caddy: there's nothing to check — Caddy logs renewals to journalctl
journalctl -u caddy | grep -i renew
如果你希望在续期失败时收到邮件通知:certbot 在签发失败时会自动向你提供的邮箱发送通知。对于 Caddy,请在你的监控系统中配置失败告警。
# From your Mac:
curl -I https://example.com
# Expected: 200 OK (or whatever your app returns), with no SSL errors
# Show the cert details:
echo | openssl s_client -showcerts -servername example.com -connect example.com:443 2>/dev/null \
| openssl x509 -inform pem -noout -text \
| grep -E "Subject:|Issuer:|Not After"
Issuer 应为"Let's Encrypt"或"ISRG";Subject 应与你的域名匹配;Not After 应为 90 天后的日期。
如需全面检测,可将你的域名提交到 https://www.ssllabs.com/ssltest/。评级应为 A 或 A+。如果更低,报告会说明需要修复的内容(通常是仍然启用的旧 TLS 版本或弱加密套件)。
--staging 参数)。