用户基于 ACME 协议 和 Certbot 自动申请与续签 Let’s Encrypt SSL证书,是当前最主流、最可靠的 HTTPS 证书自动化管理方案。下面我会从原理到实践,完整说明一下整个流程。
一、ACME 协议与 Let’s Encrypt
ACME(Automatic Certificate Management Environment) 是由 Let’s Encrypt 推动的自动化证书管理协议,允许客户端(如 Certbot)与 CA(证书颁发机构)交互,自动完成域名验证、证书申请、续签等操作,无需人工干预。
Let’s Encrypt 是一个免费、开放、自动化的 CA,完全遵循 ACME 协议,提供 90 天有效期的 SSL/TLS 证书,并鼓励自动化续签。
二、Certbot 简介
Certbot 是 EFF(电子前哨基金会)官方推荐的 ACME 客户端,功能完善,支持主流 Web 服务器(Nginx、Apache)的自动配置,也支持 standalone 模式手动验证域名所有权。它可以自动申请、安装、续签证书,并配置 Web 服务器使用 HTTPS。
三、准备工作
1. 一个已解析到服务器的域名(如 `example.com`)。
2. 服务器上的 80 端口(HTTP)和 443 端口(HTTPS)需要能够从外网访问,因为 Let’s Encrypt 的验证服务器需要访问你的服务器进行域名验证。
3. 服务器操作系统:本文以 Ubuntu 22.04 LTS 为例,其他 Linux 发行版类似。
四、安装 Certbot
1. 更新系统包
bash
sudo apt update
sudo apt upgrade -y
2. 安装 Certbot 及对应插件
根据你使用的 Web 服务器选择插件:
Nginx:`sudo apt install certbot python3-certbot-nginx`
Apache:`sudo apt install certbot python3-certbot-apache`
通用(不使用插件):`sudo apt install certbot`
如果你还没有安装 Web 服务器,可以先安装:
bash
# 安装 Nginx
sudo apt install nginx -y
# 或安装 Apache
sudo apt install apache2 -y
五、申请证书
Certbot 提供多种验证方式,最常用的是 Webroot 模式(利用已有 Web 服务器验证)和 Standalone 模式(临时占用 80 端口验证)。下面分别介绍。
方式一:使用 Nginx 插件(自动配置)
如果你的 Web 服务器是 Nginx,且已经正确配置了域名站点,可以用此方式一步完成申请和配置:
bash
sudo certbot --nginx -d example.com -d www.example.com
`--nginx`:使用 Nginx 插件。
`-d` 参数指定域名(可多个)。
执行后 Certbot 会交互式询问邮箱(用于紧急通知)、是否同意服务条款等。之后自动获取证书并修改 Nginx 配置,启用 HTTPS。
方式二:使用 Apache 插件(类似)
bash
sudo certbot --apache -d example.com -d www.example.com
方式三:Webroot 模式(手动配置)
如果你不想让 Certbot 自动修改 Web 服务器配置,或者使用其他 Web 服务器(如 Caddy),可以用 Webroot 模式。
1. 确保你的 Web 服务器已配置好 HTTP 站点(端口 80),且站点根目录可写。
2. 执行:
bash
sudo certbot certonly --webroot -w /var/www/html -d example.com -d www.example.com
`--webroot`:指定验证方式。
`-w`:指定网站的根目录(多个域名可用多个 `-w` 指定不同根目录)。
3. Certbot 会在根目录下创建 `.well-known/acme-challenge/` 临时文件,Let’s Encrypt 服务器通过 HTTP 访问这些文件来验证域名所有权。验证通过后,SSL证书会保存到 `/etc/letsencrypt/live/example.com/` 目录。
方式四:Standalone 模式(临时占用端口)
如果服务器上暂时没有 Web 服务,或者 80 端口空闲,可以使用 standalone 模式:
bash
sudo certbot certonly --standalone -d example.com -d www.example.com
Certbot 会临时启动一个 HTTP 服务(占用 80 端口)用于验证,验证完成后自动关闭。此方式需要确保 80 端口未被占用。
六、自动续签
Let’s Encrypt 证书有效期为 90 天,Certbot 会在系统定时任务中自动检查并续签即将过期的证书(通常每天运行两次)。
1. 检查续签机制
安装 Certbot 后,它会自动创建定时任务:
systemd timer(推荐):
bash
sudo systemctl list-timers | grep certbot
你会看到类似 `certbot.timer` 的服务,默认每天两次运行 `certbot renew`。
cron 任务(旧版本):
bash
sudo crontab -l | grep certbot
通常会有类似 `0 0,12 * * * ... certbot renew` 的条目。
2. 手动测试续签
你可以随时手动运行续签命令,测试是否正常:
bash
sudo certbot renew --dry-run
如果输出显示 `The dry run was successful`,说明自动续签配置正确。
3. 续签后自动重启 Web 服务器
默认情况下,Certbot 在续签后会自动执行一些钩子来重载 Web 服务器配置。如果你的 Web 服务器不是 Nginx/Apache,或者需要额外操作,可以在 `/etc/letsencrypt/renewal/` 对应的配置文件中添加 `renew_hook`。
例如在续签后重启 Nginx:
bash
sudo certbot renew --renew-hook "systemctl reload nginx"
通常插件会自动处理,无需手动干预。
七、验证证书状态
查看证书信息:
bash
sudo certbot certificates
输出会列出所有已申请的证书,包括域名、有效期、证书路径等。
八、常见问题与注意事项
1. 防火墙开放端口
确保 80 和 443 端口已开放:
bash
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
2. 域名解析正确
域名必须解析到服务器的公网 IP,否则验证会失败。
3. 多个域名
可以用 `-d` 参数添加多个域名,证书会同时包含这些域名(SAN 证书)。
4. 通配符证书
如需 `*.example.com` 这样的泛域名证书,必须使用 **DNS 验证**(手动或通过 DNS API),Certbot 支持多种 DNS 插件(如 `certbot-dns-cloudflare`)。例如:
bash
sudo certbot certonly --dns-cloudflare -d *.example.com -d example.com
5. 证书文件位置
- 证书:`/etc/letsencrypt/live/域名/fullchain.pem`
- 私钥:`/etc/letsencrypt/live/域名/privkey.pem`
在 Web 服务器配置中应指向这些路径(如果是插件自动配置,则无需手动修改)。
九、总结
通过 Certbot 基于 ACME 协议与 Let’s Encrypt 交互,我们可以实现:
- 一键申请免费 SSL证书;
- 自动配置 Web 服务器启用 HTTPS;
- 自动续签证书,完全无需人工介入。
整个过程安全、免费、自动化,是当前部署 HTTPS 的最佳实践。如果你的服务器环境特殊(如容器化、非标准 Web 服务器),Certbot 也提供了灵活的扩展方式,如 DNS 验证、自定义钩子等。
如果用户在操作过程中遇到任何问题,欢迎提供更多细节,我可以帮用户进一步排查。