教程 搜索 / 发布与基础设施 / 使用 Let's Encrypt 配置 HTTPS
📝 文字 ● 中级 更新于 2026-05-13

如何使用 Let's Encrypt 配置 HTTPS?

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 开箱即用、零成本、自动续期。

你将学到

第 1 步:前置条件

1

配置 TLS 前需要满足的条件

配置 HTTPS 需要以下三个条件已经具备:

  • 域名已指向你的服务器。DNS 中的 A 记录和/或 AAAA 记录需解析到服务器的 IP 地址。参见将域名连接到服务器
  • 服务器的 80 端口可从公网访问(这是最常见的验证方式所必需的)。如果你有防火墙,请放行 80 端口。云 VPS 通常还需要在云服务商的防火墙中开放(AWS 的安全组、Hetzner 的 Cloud Firewall 等)。
  • 已安装 Web 服务器(Nginx、Caddy 或 Apache)。对于放在负载均衡器后面的纯 API 服务器情况有所不同;对于独立 VPS,Nginx 或 Caddy 是标准路径。

如果上述任一条件尚未满足,请先解决。否则 Let's Encrypt 会以令人困惑的方式失败。

第 2 步:选择工具

2

Caddy 只需一条命令;certbot + Nginx 需要两条

两种合理的方案:

  • Caddy。现代 Web 服务器,原生内置 Let's Encrypt 支持——无需额外工具,无需额外配置。在 Caddyfile 里写上 example.com { ... },Caddy 自动搞定证书。适合从零开始的新服务器。
  • Nginx + certbot。经典组合,两个组件但文档极为完善,互联网上几乎所有教程都以此为前提。适合已有 Nginx 配置或需要精细控制的场景。

如果是全新服务器且没有 Nginx 历史包袱,Caddy 更简单。如果"Nginx 已经在跑,只是想加上 HTTPS",certbot 更合适。

第 3 步:Caddy 方案(零配置)

3

安装、配置,完成

# 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 服务。之后会自动续期。

第 4 步:Nginx + certbot 方案

4

已安装 Nginx 的情况

假设 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(或你的应用实际返回的状态码)。浏览器中的"不安全"标记消失。

HTTP-01 与 DNS-01 验证的区别。HTTP-01(默认方式)需要 80 端口可从公网访问。DNS-01 则要求你在 DNS 中添加一条 TXT 记录——适用于 80 端口被封锁、主机尚不可达,或需要申请通配符证书(*.example.com 必须使用 DNS-01)的情况。使用 certbot 进行 DNS-01 验证时,添加 --manual --preferred-challenges dns,或使用针对特定 DNS 服务商的插件(如 python3-certbot-dns-cloudflare 等)。

第 5 步:续期——已自动配置

5

确认定时任务正在运行

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,请在你的监控系统中配置失败告警。

第 6 步:验证证书

6

一条 curl 命令,一个在线检测工具

# 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 版本或弱加密套件)。

第 7 步:Let's Encrypt 不适用的情况

7

三种例外情况

  • 你使用的托管平台已自动处理 TLS。Vercel、Netlify、Cloudflare Pages 以及所有现代 PaaS 平台都会自动签发和续期证书。不必自行配置 Let's Encrypt,它们的 CDN 处理得比你更好。
  • 你需要扩展验证(EV)证书。某些企业场景要求带有法律实体验证的 EV 证书(商业 CA 每年收费 200–500 美元)。Let's Encrypt 仅提供域名验证(DV)证书。
  • 你的域名仅用于内网。Let's Encrypt 需要验证域名所有权;如果你的域名是内部域名(不在公共 DNS 中),请改用私有 CA。mkcert 是本地开发的好选择。
存在频率限制。Let's Encrypt 对每个注册域名每周最多签发 50 张证书,重复证书每周最多 5 张。正常使用完全够用;但如果脚本失控反复签发,你会触及限制并被封锁一周。测试时请使用演练环境(certbot 加 --staging 参数)。

下一步