Certbot 配合 Nginx 申请证书,是目前最官方、最傻瓜化的方案

Certbot 配合 Nginx 申请证书,是目前最官方、最傻瓜化的方案

使用 Certbot 配合 Nginx 申请证书,是目前最官方、最傻瓜化的方案。

acme.sh 相比,Certbot 最大的特点是自动化程度极高。它不仅能申请证书,甚至能直接帮你修改 Nginx 的配置文件,自动配置好 HTTPS 和 301 跳转。

以下是基于 Ubuntu/Debian 系统的标准操作流程(CentOS 类似):


第一步:安装 Certbot

Certbot 是基于 Python 开发的,官方推荐使用 snap 安装以获取最新版,但使用系统自带的包管理器(apt/yum)通常更方便且够用。

# 更新软件源  
sudo apt update  
  
# 安装核心组件和 Nginx 插件  
sudo apt install certbot python3-certbot-nginx  

第二步:一键申请并配置 (--nginx)

确保你的 Nginx 已经在运行,且配置了 server_name 指向你的域名(例如 api.yuangs.cc)。

运行这条命令,它会自动读取你的 Nginx 配置:

sudo certbot --nginx  

接下来会进入交互式界面,Certbot 会问你几个问题:

  1. 输入邮箱:用于接收证书过期提醒(必填)。
  2. 同意协议:输入 A (Agree)。
  3. 分享邮箱:输入 N (No,除非你想收广告)。
  4. 选择域名:它会列出从 Nginx 配置里读到的所有域名。
    • 输入数字选择(例如输入 1 或直接回车全选)。
  5. 是否开启强制 HTTPS 跳转? (Redirect)
    • 1: No redirect - 不修改,只开启 HTTPS。
    • 2: Redirect - 推荐选这个。Certbot 会自动在 Nginx 里插入一段 301 跳转代码,让 HTTP 自动跳到 HTTPS。

第三步:发生了什么?(底层解析)

等你看到 "Congratulations!" 时,HTTPS 已经配置好了。Certbot 在后台默默做了两件大事:

1. 证书存放

证书被存放在了 /etc/letsencrypt/live/你的域名/ 目录下:

  • fullchain.pem: 完整证书链(对应 Nginx 的 ssl_certificate)。
  • privkey.pem: 私钥(对应 Nginx 的 ssl_certificate_key)。

2. Nginx 配置被修改 (Magic)

打开你的 Nginx 配置文件,你会发现它被 Certbot **“魔改”**了。

  • 原来的 server:被插入了 ssl_certificate 等路径,以及 listen 443 ssl
  • 新增的 server(如果你选了 Redirect):Certbot 会自动增加一个监听 80 端口的块,专门负责把流量重定向到 HTTPS。

你会看到类似这样的注释,标志着这是 Certbot 自动管理的:

    ssl_certificate /etc/letsencrypt/live/api.yuangs.cc/fullchain.pem; # managed by Certbot  
    ssl_certificate_key /etc/letsencrypt/live/api.yuangs.cc/privkey.pem; # managed by Certbot  

第四步:自动续期测试

Certbot 安装时会自动在系统里添加一个定时任务(systemd timer 或 cron)。你不需要手动写脚本。

你可以运行这个命令来测试自动续期机制是否正常:

sudo certbot renew --dry-run  

如果输出 "Congratulations, all renewals succeeded",说明自动续期没问题。


💡 Certbot vs acme.sh:怎么选?

既然你两个都了解了,这里给一个最终选择建议

特性 Certbot (官方推荐) acme.sh (极客首选)
依赖 较重 (Python) 极轻 (纯 Shell)
配置 Nginx 自动修改 (省事,但会改乱格式) 不修改 (安全,需要手动配置)
侵入性 强 (接管 Nginx 配置) 弱 (只提供证书文件)
DNS API 需要额外安装插件 内置 支持几百种 DNS 商
适用人群 新手、运维 (求快,不想写配置) 开发者、极客 (求稳,想完全掌控)

我的建议:

  • 如果你不熟悉 Nginx 配置,怕写错,用 Certbot
  • 如果你有洁癖,不喜欢工具乱改你的 Nginx 配置文件,或者你的环境不能装 Python,用 acme.sh