在 DigitalOcean 上使用 Let's Encrypt 安装免费 SSL 2026 — 完整指南
HTTPS 加密已成为现代网站的基线标准。无论是为了 SEO、信誉度,还是避免缺少 SSL 时立即出现的浏览器警告,它已不再是可选项。Let's Encrypt 是一个证书颁发机构,免费自动签发 SSL 证书,是需要通过 Certbot 进行手动设置的 DigitalOcean Droplets 的理想选择。本指南将带你完成整个流程:安装、证书签发、自动续期配置和常见问题故障排除。
目录
什么是 Let's Encrypt?它真的免费吗?
Let's Encrypt 是一个非营利性证书颁发机构 (CA),由互联网安全研究小组 (ISRG) 运营,成立目的是推动整个互联网默认采用 HTTPS。它得到了 Mozilla、EFF(电子前哨基金会)、Cisco、Google Chrome 和众多托管提供商等主要组织的支持。它最大的优势是 Let's Encrypt 颁发的 SSL/TLS 证书完全免费——没有隐藏费用,无需信用卡,没有域名使用数量限制(受速率限制的限制以防止滥用)。 一个常见问题是:"它真的免费吗?为什么?"答案是 Let's Encrypt 依赖于通过 ACME 协议(自动证书管理环境)的完全自动化,与需要工作人员手动审查文件的传统 CA 相比,大大降低了运营成本。颁发的证书仅限域名验证 (DV),这意味着验证您拥有该域名——而不是扩展验证 (EV) 或组织验证 (OV),后者需要公司文件以在浏览器地址栏中显示公司名称。这使它们不适合银行或需要显示公司身份的组织,但对于典型网站、博客、小中型电子商务商店或 API 端点来说完全足够。 一个需要了解的关键限制:证书仅在 90 天后过期——远短于典型购买证书(通常 1 年以上)。这种短生命周期是有意的:Let's Encrypt 强制自动续期以降低来自长期使用泄露的私钥的风险。通过从一开始正确配置自动续期,系统管理员几乎不需要再考虑它。 对于 DigitalOcean 用户,启用 HTTPS 有多种方式,取决于您的架构。在 Droplet 上直接运行网络服务器(自我管理)需要如本指南所述安装 Certbot。App Platform 在您绑定自定义域名的那一刻起会自动处理 SSL 证书的颁发和续期。在多个 Droplets 前面使用负载均衡器?DigitalOcean 的负载均衡器有一个内置功能,可以通过控制面板自动绑定 Let's Encrypt 证书——无需在每个 Droplet 上管理 Certbot。本指南重点介绍基于 Droplet 的使用 Certbot 进行安装,这是最广泛使用和最灵活的方法。
- Let's Encrypt 完全免费颁发证书,无隐藏成本
- 仅支持域名验证 (DV)——不支持 EV/OV
- 证书生命周期仅为 90 天;自动续期至关重要
- DigitalOcean 提供三种方式:Droplet+Certbot、App Platform 自动 SSL、负载均衡器自动 Let's Encrypt
在 Ubuntu/Debian 上安装 Certbot
Certbot 是由 EFF 开发的官方客户端工具,用于通过 ACME 协议自动与 Let's Encrypt 通信。它支持通过两种主要方法在 Ubuntu 和 Debian 上安装:apt 包管理器和 snap。Certbot 团队现在正式推荐使用 snap,因为它始终提供最新版本并自动更新。
apt 方法(更简单,适合优先考虑简洁的 Droplets)从更新您的包列表开始:sudo apt update。然后安装 Certbot 以及您的网络服务器的插件。对于 Nginx,运行 sudo apt install certbot python3-certbot-nginx;对于 Apache,使用 sudo apt install certbot python3-certbot-apache。这些插件在成功签发证书后自动修改您的网络服务器配置,消除了手动配置编辑的需要。
或者,通过 snap 安装——Certbot 官方文档(certbot.eff.org)首先推荐的方法。Ubuntu 默认包括 snapd。运行 sudo snap install --classic certbot 进行安装,然后创建一个符号链接以使 certbot 命令系统范围内可用:sudo ln -s /snap/bin/certbot /usr/bin/certbot。
在签发证书之前,验证您的 Droplet 开放端口 80(HTTP)和 443(HTTPS)以接收传入流量。Let's Encrypt 需要在端口 80 上到达您的网络服务器以验证域名所有权(HTTP-01 质询)。如果在 Ubuntu 上使用 ufw,可以使用 sudo ufw allow 'Nginx Full' 对于 Nginx 或 sudo ufw allow 'Apache Full' 对于 Apache 轻松打开它们,这将同时打开两个端口。如果使用 DigitalOcean 的云防火墙(一项免费功能,无额外成本),在控制面板中添加入站规则以允许 TCP 端口 80 和 443 来自任何地方;否则,即使 ufw 开放,由于云防火墙在网络层阻止,证书请求也会超时。使用 certbot --version 测试成功安装。
- apt:
sudo apt install certbot python3-certbot-nginx(或 python3-certbot-apache) - snap(Certbot 团队推荐):
sudo snap install --classic certbot - 在 ufw 和 DigitalOcean 云防火墙中打开端口 80/443(免费)
为 Nginx/Apache 签发证书
安装了 Certbot 及其插件后,签发证书只需一个命令——Certbot 自动处理所有事务:域名验证、证书请求和网络服务器配置更新。
对于 Nginx,运行 sudo certbot --nginx -d example.com -d www.example.com。您可以通过重复 -d 标志指定多个域名或子域名,如果您想让 apex 和 www 共享单个 SAN 证书,这很完美。对于 Apache,使用相同的命令但使用 --apache:sudo certbot --apache -d example.com -d www.example.com。
首次运行时,Certbot 以交互方式提示获取额外信息:过期和安全警报的电子邮件地址、同意 Let's Encrypt 的服务条款,以及是否自动将 HTTP 流量重定向到 HTTPS(强烈建议强制用户通过 HTTPS 浏览)。回答后,Certbot 自动修改 Nginx 或 Apache 的配置,添加一个 HTTPS 服务器块,指向存储在 /etc/letsencrypt/live/example.com/ 中的证书文件。
如果您更喜欢 Certbot 不修改您的网络服务器配置——也许您使用不支持的服务器或有复杂的现有设置——请改用 certonly 模式:sudo certbot certonly --nginx -d example.com。这将在不接触您的配置的情况下签发证书。或者,sudo certbot certonly --standalone -d example.com 临时在端口 80 上启动自己的网络服务器进行验证,当没有网络服务器运行或您需要证书用于非网络服务(如邮件服务器或自定义应用程序)时非常有用。
成功签发后,通过在浏览器中访问 https://example.com 进行验证——您应该看到一个挂锁图标。或者使用 sudo certbot certificates 检查 Droplet 上的所有证书以查看过期日期。
- Nginx:
sudo certbot --nginx -d example.com -d www.example.com - Apache:
sudo certbot --apache -d example.com - 对于非网络服务使用
certonly --standalone模式
设置证书自动续期
由于 Let's Encrypt 证书仅在 90 天后过期,自动续期设置与初始签发同样重要。好消息:通过 apt 或 snap 安装的当前版本自动设置计划任务——无需手动配置。
对于 snap 安装,systemd 自动创建一个计时器。使用 systemctl status certbot.timer 检查其状态,它通常每天运行两次,仅续期在 30 天内过期的证书(跳过其他证书以避免浪费速率限制配额)。对于某些发行版上的 apt 安装,/etc/cron.d/certbot 处理这个问题;使用 cat /etc/cron.d/certbot 进行检查。
总是使用 sudo certbot renew --dry-run 立即测试续期,无需等待实际过期。这模拟整个续期过程,而不与 Let's Encrypt 联系(保留速率限制配额)。如果它完成时没有错误,您的自动续期就已准备好。
一个常被忽视的细节:续期完成后,您的网络服务器必须从磁盘重新加载新证书——否则,运行中的进程继续使用内存中的旧证书,直到重启。Certbot 通过续期后挂钩解决这个问题。添加一个部署挂钩以优雅地重新加载您的网络服务器:sudo certbot renew --deploy-hook "systemctl reload nginx"。这指示 Nginx 重新加载而不删除现有连接(与重启不同,重启会切断所有连接)。
对于细粒度的计划控制,手动添加一个 cron 作业,如 0 0,12 * * * root certbot renew --quiet --post-hook "systemctl reload nginx" 每天在午夜和正午运行。但是,这通常是不必要的,因为 Certbot 已经自动处理了。定期检查 /var/log/letsencrypt/letsencrypt.log 处的续期日志以获得安心。
- Certbot 在安装后立即自动设置自动续期(systemd 计时器或 cron)
- 使用
sudo certbot renew --dry-run测试而不影响速率限制 - 自动续期仅处理在 30 天内过期的证书
- 使用
--deploy-hook "systemctl reload nginx"优雅地重新加载网络服务器 - 定期检查
/var/log/letsencrypt/letsencrypt.log处的日志
常见问题故障排除
综合多次测试,尽管 Certbot 的用户友好设计,DigitalOcean 用户遇到的问题是反复出现的。最常见的:签发证书期间出现"授权程序失败"或超时,通常由端口 80 被阻止引起——要么被 Droplet 上的 ufw,要么被网络层的 DigitalOcean 云防火墙。检查两层,因为仅打开 ufw 如果云防火墙在上游阻止是不够的。快速测试:curl -I http://example.com 从 DigitalOcean 外部运行以在运行 certbot 之前验证端口 80 是否可达。
第二个问题:DNS 尚未传播或 A 记录不指向您的 Droplet 的 IP。Let's Encrypt 必须通过互联网访问您的域名以验证所有权。如果 DNS 仍然指向旧托管或尚未更新,证书签发立即失败。在尝试 certbot 之前,使用 dig example.com +short 或 nslookup example.com 验证结果与您的 Droplet 的 IP 匹配。
第三:触及 Let's Encrypt 的速率限制——每周每个主域名 50 个证书,每周 5 个重复证书。这来自于在调试时反复运行 certbot。预防:总是在测试时使用 --dry-run 或 --staging。Staging 指向 Let's Encrypt 的测试环境,具有宽松的限制并产生浏览器不信任的证书(仅用于测试):sudo certbot certonly --staging -d example.com。
其他问题包括在 Droplets 之间手动复制证书后的私钥权限错误——不要这样做。/etc/letsencrypt/ 文件夹包含复杂的符号链接结构;而是在目标 Droplet 上签发新证书。最后,启用 HTTPS 后的混合内容错误——某些资源(图像、脚本、CSS)仍然在 HTML 中硬编码为 http://。通过使用相对路径或在整个过程中切换到 https:// 修复。
- 端口 80 被 ufw 或 DigitalOcean 云防火墙阻止——检查两层
- DNS 尚未传播到您的 Droplet IP——使用
dig example.com +short验证 - 触及 50 个证书/周的速率限制——在测试期间使用
--staging - 不要直接在 Droplets 之间复制
/etc/letsencrypt/
何时使用此功能(真实用例)
在 Droplet 上使用 Certbot 安装 SSL 适合许多情况,但在 DigitalOcean 的生态系统中并不总是正确的选择。理解何时选择哪种方法很重要。
第一种情况:在单个 Droplet 上运行网络服务器(Nginx 或 Apache)的网站或应用程序——WordPress、个人博客、小中型 API 后端。在这里,Certbot 是最直接的选择:安装一次,永远自动续期,DigitalOcean 没有额外费用。
第二种:多个 Droplets 在 DigitalOcean 负载均衡器后面。无需在每个 Droplet 上安装 Certbot。DigitalOcean 负载均衡器(起价 $12/月)通过控制面板自动集成 Let's Encrypt——续期在负载均衡器级别进行,减少了在许多服务器之间管理证书的复杂性。对于水平缩放体系结构来说是理想的。
第三种:需要覆盖所有子域名的通配符证书,如 *.example.com。标准 HTTP-01 质询无法做到这一点;使用通过 certbot-dns-digitalocean 插件的 DNS-01。这与 DigitalOcean 的 API 连接,使用个人访问令牌,自动创建 DNS TXT 记录以进行验证,无需打开端口 80。对于管理许多子域名并希望集中证书管理的团队来说非常完美。
反之,如果使用 DigitalOcean 的 App Platform 而不是直接管理 Droplets,几乎不要接触 Certbot——该平台在您绑定自定义域名的那一刻起自动签发和续期证书。对于希望减少 DevOps 开销而不进行 OS 级服务器控制的团队来说是理想的。总之:将您的方法与实际架构对齐——Certbot on Droplets 不是每种情况的默认值。
- 单个 Droplet 带 Nginx/Apache——Certbot 是最直接的选择
- 多个 Droplets 在负载均衡器后面——使用负载均衡器的 Let's Encrypt 集成(最低 $12/月)
- 需要通配符证书——通过
certbot-dns-digitalocean使用 DNS-01 - 使用 App Platform——SSL 是自动的;无需 Certbot
常见错误及其修复方法
综合多次测试,除了技术问题,流程级别的错误经常给系统管理员制造问题,造成比初始设置更糟的问题。
第一个错误:设置后跳过自动续期测试。许多人安装 Certbot、成功签发证书,然后再也不检查——直到 90 天过去、证书过期、浏览器警告用户。解决方案:设置后立即运行 sudo certbot renew --dry-run。另外,配置单独的监控(DigitalOcean 监控或正常运行时间检查)以在 SSL 问题出现时发出警报。
第二个:重建或销毁 Droplet 而不首先备份 /etc/letsencrypt/。您之后需要重新签发所有证书——如果您不触及速率限制,这并不是灾难性的,但是浪费的。解决方案:使用 DigitalOcean 快照定期快照您的 Droplet(成本 $0.06/GiB/月),它会自动包括证书文件夹。或者至少在进行重大更改前手动备份此文件夹。
第三个:设置后手动编辑网络服务器配置,没有意识到 Certbot 自动管理 SSL 块。这会创建冲突或重叠的配置块。更安全的方法:让 Certbot 处理所有与 SSL 相关的部分;仅编辑非证书部分,如位置块和代理通过。
第四个:仅在 ufw 中打开端口 443,而不是在 DigitalOcean 云防火墙中添加相应的规则,然后想知道为什么用户无法访问 HTTPS。自动续期使用端口 80 工作良好,但真实用户在 443 上的连接因网络层阻止而无声失败。解决方案:进行更改时总是验证 ufw 和云防火墙规则匹配。
- 跳过自动续期测试——设置后立即运行并验证
- 重建 Droplet 而不备份
/etc/letsencrypt/——使用快照($0.06/GiB/月) - 手动编辑网络服务器配置超过 Certbot 管理的部分——造成配置冲突
- 仅在 ufw 中打开端口 443,不在云防火墙中——用户无法访问 HTTPS
最佳实践
在 Droplet 上初始 Let's Encrypt SSL 设置后,采用这些实践长期维护稳定性和安全性——而不仅仅是让它在第一次工作。
首先:在请求真实证书前测试或调试新配置时始终使用 --staging,避免不必要的速率限制消耗。在迭代多个 Nginx/Apache 配置调整时特别重要。
第二:在确认 HTTPS 可靠运作后启用 HSTS(HTTP 严格传输安全),通过将 Strict-Transport-Security 头部添加到您的网络服务器配置。这强制浏览器仅在未来访问时使用 HTTPS,即使用户键入 http://。首先彻底测试以确保所有子域名都支持 HTTPS,因为配置错误的 HSTS 可能会暂时阻止访问。
第三:配置 Certbot 自动续期之外的单独监控。不仅依赖 Certbot 的计划任务。使用 DigitalOcean 监控或第三方 SSL 过期检查(如您的控制面板的内置 SSL 检查器)作为安全网。这在续期因任何原因失败时立即向您发出警报。
第四:采用 --deploy-hook 在续期后自动重新加载证书,避免可能中断用户的手动服务器重启。
第五:通过 DigitalOcean 快照或单独存储定期备份 /etc/letsencrypt/,特别是在 OS 升级或 Droplet 迁移前,减少重新签发所有证书的需要。
最后:保持 Certbot 更新到最新版本。Snap 安装自动更新,但 apt 安装需要通过 sudo apt update && sudo apt upgrade certbot 进行手动更新。Let's Encrypt 和 ACME 标准不断发展以增强安全性;过时的 Certbot 版本冒着未来兼容性问题的风险。
- 测试时始终使用
--staging以避免触及生产速率限制 - 仅在所有子域名的 HTTPS 稳定后启用 HSTS
- 配置独立于自动续期的 SSL 过期的单独监控
- 使用
--deploy-hook优雅地重新加载您的网络服务器 - 进行重大更改前通过快照备份
/etc/letsencrypt/
常见问题(FAQ)
certbot renew --dry-run 测试以获得保证。--staging 以避免这个问题。