什么是 Certbot
Certbot 是一个由 Electronic Frontier Foundation (EFF) 开发的开源命令行工具,用于自动获取和续期 Let’s Encrypt 提供的免费 SSL/TLS 证书。它是目前最流行的 ACME(Automatic Certificate Management Environment)客户端,几乎成为 VPS 上配置 HTTPS 的事实标准。
核心功能
| 功能 | 说明 |
|---|---|
| 获取证书 | 自动完成 ACME 协议验证,从 Let’s Encrypt 申请免费证书 |
| 续期证书 | 自动检测即将过期的证书并续期(Let’s Encrypt 证书有效期 90 天) |
| 配置 Web 服务器 | 自动修改 Nginx/Apache 配置以启用 HTTPS |
常用命令
# 为 Nginx 获取并配置证书(最常用)certbot --nginx -d example.com -d www.example.com
# 为 Apache 获取并配置证书certbot --apache -d example.com
# 仅获取证书(不修改 Web 服务器配置)certbot certonly --webroot -w /var/www/html -d example.com
# 手动验证(适合无法自动验证的场景,如非 HTTP 挑战)certbot certonly --manual -d example.com
# 续期所有已安装的证书certbot renew
# 查看当前所有已安装的证书信息certbot certificates验证方式
Certbot 需要向 Let’s Encrypt 证明你拥有该域名,支持以下几种验证方式:
Webroot
在网站根目录放置验证文件,Let’s Encrypt 通过 HTTP 访问该文件来完成验证。这是最常用的方式,不需要停止 Web 服务器。
Standalone
Certbot 自己启动一个临时 HTTP 服务器(默认监听 80 端口)来完成验证。适合没有运行中的 Web 服务器的场景,但需要确保 80 端口未被占用。
Nginx / Apache
利用现有 Web 服务器进行验证。Certbot 会临时修改 Nginx/Apache 配置来响应验证请求,验证完成后恢复原配置。
DNS
通过添加 DNS TXT 记录来验证域名所有权。这是唯一支持申请通配符证书(*.example.com)的方式,但要求 DNS 提供商支持 API 自动添加记录,或手动添加后等待生效。
典型工作流(配合 Nginx)
以下是在一台裸机 VPS 上从零开始配置 HTTPS 的完整流程:
# 1. 安装 certbot 及 nginx 插件sudo apt install certbot python3-certbot-nginx
# 2. 确保 Nginx 已配置好 server_name# 例如 server_name api.example.com; 在 80 端口监听
# 3. 一键获取证书并自动配置 Nginx HTTPSsudo certbot --nginx -d api.example.com
# 4. 验证证书安装成功curl -I https://api.example.com安装完成后,Certbot 会自动配置 systemd 定时器来定期续期:
# 查看续期定时器状态(安装时自动创建)systemctl status certbot.timer
# 手动触发一次续期(测试用)sudo certbot renew --dry-run实际场景:什么时候不需要 Certbot
Certbot 解决的是”裸机 VPS + 自有域名”场景下的 HTTPS 问题。但在现代架构中,TLS 终止往往不在应用服务器上,而是在前置的反向代理或 CDN 层。以下场景不需要 Certbot:
| 架构 | TLS 由谁管理 | 为什么不需要 Certbot |
|---|---|---|
| Cloudflare Tunnel | cloudflared 进程自动管理 | cloudflared 启动后自动向 Cloudflare 边缘请求证书,不经过 ACME 协议 |
| Cloudflare 代理模式 | Cloudflare Universal SSL | Cloudflare 自动为代理域名签发并管理证书 |
| 云厂商负载均衡 | 云厂商证书服务 | 阿里云/阿里云 SLB/CDN 自带证书托管,无需本地管理 |
| Kubernetes Ingress | cert-manager | 集群内部使用 cert-manager(也是 ACME 客户端,但不是 Certbot) |
关键判断依据:如果对外暴露的 HTTPS 端口不是直接连到你的服务器,而是在某一层被终止了,那你的服务器上就不需要 Certbot。