服务器通过 HTTP 代理上网如何配置 Certbot 完成 Let's Encrypt 续签?

文章导读
如果服务器 outbound 流量必须经过 HTTP 代理才能访问外网,直接在运行 Certbot 命令前设置环境变量是最稳妥的方案,适用于企业内网或有出站限制的生产环境。
📋 目录
  1. A 命令速用版
  2. B 原理简述
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 参考来源
A A

如果服务器 outbound 流量必须经过 HTTP 代理才能访问外网,直接在运行 Certbot 命令前设置环境变量是最稳妥的方案,适用于企业内网或有出站限制的生产环境。

先说结论:Certbot 支持通过标准环境变量指定代理,无需修改源码或复杂配置,但需确保自动续签任务也能继承该环境变量。

  • 适合:出站流量受限、必须经由网关代理才能访问 Let's Encrypt API 的服务器。
  • 先准备:确认代理地址、端口及是否需要认证,测试代理连通性。
  • 验收:手动续签成功且自动定时任务能正常获取新证书。

命令速用版

在终端中临时设置环境变量并执行续签(推荐 inline 方式,避免 sudo 丢失变量):

sudo HTTP_PROXY=http://代理 IP:端口 HTTPS_PROXY=http://代理 IP:端口 certbot renew

如果需要代理认证,格式为 http://用户:密码@代理 IP:端口。若密码包含特殊字符,需进行 URL 编码。

原理简述

Certbot 是基于 Python 编写的工具,其底层网络请求库默认会读取操作系统标准的环境变量 HTTP_PROXYHTTPS_PROXY。只要在这些变量生效的环境中运行 Certbot,它发出的 ACME 协议请求就会自动经过指定的代理服务器,不需要额外安装插件或修改配置文件。

分步处理

1. 测试代理连通性

先确认代理是否能访问 Let's Encrypt 的 API 地址,避免配置无效:

curl -I `--proxy` http://代理 IP:端口 https://acme-v02.api.letsencrypt.org/directory

如果返回 HTTP 200 或 301,说明网络通路正常。

2. 手动执行续签

使用 export 设置变量后运行,方便排查错误。注意 sudo 默认会重置环境变量,需添加 -E 参数保留环境变量:

服务器通过 HTTP 代理上网如何配置 Certbot 完成 Let's Encrypt 续签?
export HTTP_PROXY=http://代理 IP:端口
export HTTPS_PROXY=http://代理 IP:端口
sudo -E certbot renew `--dry-run`

`--dry-run` 参数会模拟续签过程,不会消耗正式速率限制,适合测试配置。

3. 配置自动续签

手动成功不代表定时任务能成功。根据安装方式不同,环境变量注入方式不同:

  • Apt 包管理安装(Debian/旧版 Ubuntu):编辑 /etc/default/certbot,添加 HTTP_PROXY="http://代理 IP:端口"HTTPS_PROXY="http://代理 IP:端口"
  • Snap 安装(新版 Ubuntu 默认):使用 systemd 覆盖配置。运行 systemctl edit snap.certbot.renew.timer,在编辑器中输入:
[Service]
Environment="HTTP_PROXY=http://代理 IP:端口"
Environment="HTTPS_PROXY=http://代理 IP:端口"

保存退出后,运行 systemctl daemon-reload 生效。若不确定 timer 名称,可使用 systemctl list-timers | grep certbot 查看。

怎么验证是否生效

1. 查看证书有效期

sudo certbot certificates

观察 Expiry Date 是否更新。如果是测试环境,使用 `--dry-run` 后查看日志输出是否显示 Simulated renewal of non-expired certificates succeeded

2. 检查定时任务日志

查看系统日志确认自动任务是否报错:

服务器通过 HTTP 代理上网如何配置 Certbot 完成 Let's Encrypt 续签?
sudo grep certbot /var/log/letsencrypt/letsencrypt.log

或者查看 systemd 状态:

systemctl status snap.certbot.renew.timer

常见坑

1. 自动任务未继承环境变量

这是最常见的问题。手动 export 只对当前 shell 会话生效,cron 或 systemd 启动的任务不会读取用户的 .bashrc。必须写入系统级配置文件或通过 systemctl edit 注入。

2. sudo 环境变量丢失

默认情况下 sudo 会清除大部分环境变量。如果使用 export 方式,务必加上 -E 参数(即 sudo -E),或者直接在命令前 inline 设置变量。

3. 本地验证被代理

如果使用 http-01 挑战,Certbot 需要在本地开启监听。确保 NO_PROXY 包含了本地地址(如 localhost,127.0.0.1),否则本地验证请求可能被发往代理导致失败。

4. 代理认证特殊字符

如果代理密码包含特殊字符(如 @、:、/),需要进行 URL 编码,否则会导致解析错误。

参考来源

  • Certbot 官方文档 - Instructions
  • Let's Encrypt Community Forum - Behind proxy topics