如果你运营网站或 Web 应用,那么 HTTPS 是必选项。没有它,访客会看到警告,信任会迅速消失。HTTPS 的核心是一张 SSL/TLS 证书,它证明你的站点安全、人们可以放心与之交互。多年前,配置证书是个痛苦的过程,但今天已容易得多。得益于 ACME 协议以及 Certbot 等工具,你可以在几分钟内拿到证书并让它自动续期。
本指南将准确演示如何做到这一点。我们将覆盖基于 Debian 和基于 Red Hat 的系统,以及 Snap 包的安装方式。你会看到所需的命令,以及如何处理通配符证书与设置自动续期。
先决条件
在深入安装 Certbot 并获取 SSL 证书之前,有几件事你应该先准备好。检查它们花不了多少时间,但跳过它们正是人们日后遇到错误最常见的原因。
- Sudo 或 Root 权限
Certbot 需要配置你的 Web 服务器并将证书写入系统目录。这意味着你需要管理员权限。如果你使用 VPS 或独立服务器,请确保能以 sudo 运行命令。 - 已注册且 DNS 记录正确的域名
你的域名应已注册并指向你的服务器。在 DNS 中创建一条 A 记录,将 example.com 这样的域名解析到其公网 IP。如果你计划使用子域名,请确保那些 DNS 记录也已设置。 - 开放 80 和 443 端口
ACME 证书验证需要 80/HTTP 与 443/HTTPS 的入站访问。如果你启用了 UFW、Firewalld 或云安全组等防火墙,请确认这两个端口都已开放。没有它,Certbot 无法完成域名验证挑战。
第 1 步——安装 Certbot
用 ACME SSL 保护 Apache 或 Nginx 服务器的第一步是安装 Certbot。这个工具负责证书的申请与续期,可根据你的 Linux 发行版与包管理器以多种方式安装。
- 使用 APT 在 Debian/Ubuntu 上安装 Certbot
如果你运行基于 Debian 的发行版(如 Ubuntu),可直接从 APT 仓库安装。先更新包索引:
根据 Web 服务器安装正确的 Certbot 插件:sudo apt update
(针对 Apache)sudo apt install certbot python3-certbot-apache
(针对 Nginx)sudo apt install certbot python3-certbot-nginx - 使用 DNF 或 YUM 在 CentOS、RHEL、Fedora 上安装
在基于 Red Hat 的发行版上,你需先启用 EPEL 仓库(Extra Packages for Enterprise Linux),它包含 Certbot 等许多附加工具:
(或较旧系统用)sudo dnf install epel-release
然后刷新仓库:sudo yum install epel-release
(或)sudo dnf clean all && sudo dnf update
安装对应插件的 Certbot:sudo yum clean all && sudo yum update
(或较旧 Yum 系统用)sudo dnf install certbot python3-certbot-apache
(针对 Apache)sudo yum install certbot python-certbot-apache
(或)sudo dnf install certbot python3-certbot-nginx
(针对 Nginx)sudo yum install certbot python-certbot-nginx - 使用 Snap 安装 Certbot
Snap 是另一种通用的 Certbot 安装方式,通常提供最新版本。如果你的系统支持 Snap,这是个好选择。首先安装 Snap(若尚未安装):
(基于 Debian)sudo apt install snapd
(基于 Red Hat)然后经由 Snap 安装 Certbot:sudo dnf install snapd
创建软链接使 Certbot 全局可用:sudo snap install core sudo snap refresh core sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Certbot 安装完成后,便可真正申请并安装 SSL 证书。一旦 Certbot 配置好,安装方式并不重要,证书签发的命令看起来都一样。
第 2 步——申请并安装你的 ACME 证书
下一步是真正申请并安装你的 ACME SSL 证书。这个过程因你是为单域名、多域名还是通配符域名签发而略有不同。
- 单域名或多域名的标准证书
大多数网站只需一张标准 SSL 证书,它同时覆盖主域名和几个子域名,例如 ssl2buy.com、www.ssl2buy.com 以及可能的 api.ssl2buy.com。Certbot 让这变得简单。常见结构如下:
若你运行的是 Apache,将 --nginx 替换为 --apache。下面拆解这个命令的重要参数:sudo certbot --nginx \ --non-interactive \ --agree-tos \ --server <ACME_endpoint> \ --email <your-email> \ --eab-kid <EAB_ID> \ --eab-hmac-key <EAB_Key> \ --domain <DOMAINNAME> \ --cert-name <friendlyname>
- nginx / apache 告诉 Certbot 要配置哪个 Web 服务器。
- non-interactive 在无用户提示下运行(适合自动化)。
- agree-tos 自动同意 CA 的服务条款。
- email 提供用于续期通知的邮箱地址。
- server 是 CA 的 ACME 端点,通常可在你的证书订单详情中找到。
- eab-kid 与 eab-hmac-key 是你的 CA 提供的 ACME 认证凭据。
- domain 是证书要覆盖的域名。你可以多次重复此参数以覆盖更多域名。
- cert-name 是一个可选的友好名称,便于日后识别该证书。
- 使用 DNS 验证的通配符证书
像 *.securedomain.com 这样的通配符证书稍复杂一些。ACME 对它们要求 DNS-01 验证,意味着 Certbot 必须在验证过程中创建特殊的 DNS TXT 记录。与标准证书不同,经由 80 端口的 HTTP 验证在此不起作用。
- 使用受支持的 DNS 提供商插件
Certbot 为许多流行 DNS 提供商提供了插件:
- AWS Route53 → certbot-dns-route53
- Google Cloud DNS → certbot-dns-google
- DigitalOcean → certbot-dns-digitalocean
- GoDaddy 社区插件 → certbot-dns-godaddy
- Cloudflare 经由 Lexicon 或插件
然后创建凭据文件:sudo apt install python3-certbot-dns-digitalocean
~/.secrets/certbot/digitalocean.ini dns_digitalocean_token = YOUR_DO_API_TOKEN
用插件运行 Certbot:chmod 600 ~/.secrets/certbot/digitalocean.ini
sudo certbot certonly \ --dns-digitalocean \ --dns-digitalocean-credentials ~/.secrets/certbot/digitalocean.ini \ --server <ACME_endpoint> \ --domain *.example.com \ --eab-kid <EAB_ID> \ --eab-hmac-key <EAB_Key> \ --email <your-email> \ --agree-tos \ --cert-name example-wildcard - 如果没有插件
若你的 DNS 提供商没有插件,可使用带 hook 的手动模式:
certbot certonly \ --manual \ --preferred-challenges dns \ --manual-auth-hook /path/to/auth.sh \ --manual-cleanup-hook /path/to/cleanup.sh \ --server <ACME_endpoint> \ --domain *.example.com \ --eab-kid <EAB_ID> \ --eab-hmac-key <EAB_Key> \ --email <your-email> \ --agree-tos \ --cert-name example-wildcard- manual-auth-hook 是创建 DNS TXT 记录的脚本。
- manual-cleanup-hook 是在验证后移除 TXT 记录的脚本。
- 使用受支持的 DNS 提供商插件
第 3 步——验证安装
一旦申请并安装好证书,就该确认一切确实正常工作。很容易想当然认为 Certbot 已完成工作,但快速验证能确保你的站点正确地通过 HTTPS 提供流量。
- 检查 Web 服务器状态
确保 Web 服务器无错误运行:
(Debian 系 Apache)sudo systemctl status apache2
(Red Hat 系 Apache)sudo systemctl status httpd
(任意发行版 Nginx)若服务显示 "active (running)",说明服务器已用新证书启动运行。sudo systemctl status nginx - 用 OpenSSL 验证证书
你可直接用 openssl 检查 SSL 握手以做更深入的核查:
此命令可看到 Common Name 与主题备用名称(SAN)。这是确认预期证书确在被提供的一种快捷方式。openssl s_client -connect yourdomain.com:443 - 浏览器测试
在浏览器中用 https:// 打开你的域名。若配置正确,应看到熟悉的信任图标。点击它,证书会显示颁发 CA 与过期日期。如果看起来不对(例如站点仍在提供 HTTP、显示错误证书或浏览器报 SSL 错误),通常指向以下三个问题之一:
- DNS 未指向正确的服务器。
- 安装证书后 Web 服务器配置未重新加载。
- 防火墙或反向代理干扰。
第 4 步——自动化证书续期
如果你使用带 Certbot 的 ACME 证书,就无需手动跟踪过期日期。这是相比其他类似方案最大的优势之一。组织管理员通常被困在续期证书上,因为它们通常只持续几天到一年。借助 certbot,这件事被自动化,你的站点在零停机的情况下保持安全。
- 先做一次续期测试
在设置自动化之前,先跑一次干跑续期是个好主意。它在不真正替换证书的情况下检查一切是否配置正确:
若运行无错,你便可开始自动化。sudo certbot renew --dry-run - 现代 Linux 发行版用 systemd 自动续期
Ubuntu 18.04+、CentOS 8+ 与 RHEL 8+ 使用 systemd 定时器自动处理续期。你可用以下命令检查是否启用:
你应看到类似这样的条目:"Mon 2025-08-25 10:00:00 UTC 12h left n/a n/a certbot.timer certbot.service"。这意味着 Certbot 被安排每天运行两次。若证书在 30 天内到期,它将被自动续期。systemctl list-timers | grep certbot - 较旧系统用 Cron 自动续期
若你的 Linux 发行版不支持 systemd 定时器,可使用 cron 任务。用以下命令编辑 crontab:
然后添加此条目以每天运行两次续期:sudo crontab -e
0 */12 * * * certbot renew --quiet --post-hook "systemctl reload nginx"- quiet 抑制输出,除非有错误。
- post-hook 仅当证书被续期时重新加载 Web 服务器。
--post-hook "systemctl reload apache2" - 续期 Hook(可选)
有时你需要的不仅仅是重新加载服务器。也许是更新负载均衡器、重启反向代理或在多个节点间同步证书。Certbot 为这些情况提供支持 hook:
- /etc/letsencrypt/renewal-hooks/pre/ → 在续期前运行
- /etc/letsencrypt/renewal-hooks/deploy/ → 在成功续期后运行
- /etc/letsencrypt/renewal-hooks/post/ → 在每次尝试后运行
别忘了使其可执行:#!/bin/bash systemctl reload nginx
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload.sh
结语
用 Certbot 让 SSL 运行起来,关乎让你的站点对使用者而言值得信任。一旦你在浏览器中看到那个安全标识,并知道续期已被妥善处理,整件事就成了背景的一部分。这正是良好基础设施的意义——它在你专注于构建、写作或发布最重要事物时,安静地持续工作。
用 ACME 方案自动化 SSL 安装与续期
借助来自立海世纪的 ACME SSL 证书,让证书续期变得简单。为你的 Apache 或 Nginx 服务器获取可信、易安装且经济的安全保护。
获取 ACME SSL 证书
相关文章:
- 什么是 ACME 协议及其工作原理:完整指南
- ACME 如何变革现代企业的 SSL 自动化
- 如何使用 Certbot 在 cPanel/WHM 上安装 Sectigo ACME SSL 证书
- 如何使用 Win-ACME 与 EAB 凭据在 IIS 上安装 SSL 证书
- 什么是 8080 端口以及它与 80 和 443 端口的区别