apisix/ssl_manager
..
2026-01-01 17:12:14 +00:00

APISIX SSL 证书自动管理

基于 Certbot + APISIX Admin API 的 SSL 证书自动申请和续期方案。

功能特性

  • 自动申请 Let's Encrypt 免费 SSL 证书
  • 自动将证书同步到 APISIX
  • 自动续期证书90 天有效期)
  • 监听路由创建,自动为新域名申请证书
  • 支持多域名证书
  • 支持测试环境staging

目录结构

ssl_manager/
├── ssl_manager.py          # SSL 证书管理主脚本
├── route_watcher.py        # 路由监听服务
├── certbot_deploy_hook.sh  # Certbot 部署钩子
├── config.json            # 配置文件
├── requirements.txt       # Python 依赖
└── README.md             # 说明文档

安装步骤

1. 安装 Certbot

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install certbot

# CentOS/RHEL
sudo yum install certbot

2. 安装 Python 依赖

cd /home/jingrow/apisix/ssl_manager

# 方法一:使用 uv推荐更快
uv pip install --system -r requirements.txt

# 方法二:使用 pip3
pip3 install -r requirements.txt

3. 配置

配置已直接定义在 Python 文件中,不需要 config.json

方式一:直接修改 Python 文件(推荐)

编辑 ssl_manager.py 中的 DEFAULT_CONFIG

DEFAULT_CONFIG = {
    'apisix_admin_url': 'http://localhost:9180',
    'apisix_admin_key': '你的APISIX管理密钥',  # 修改这里
    'letsencrypt_email': 'your-email@example.com',  # 修改这里
    'letsencrypt_staging': False,  # 生产环境改为 False
    # ... 其他配置 ...
}

方式二:使用环境变量

export APISIX_ADMIN_KEY="your-admin-key"
export LETSENCRYPT_EMAIL="your-email@example.com"
export LETSENCRYPT_STAGING="false"

详细配置说明请查看 CONFIG.md

4. 创建 Webroot 目录

Certbot 需要 webroot 目录用于验证:

sudo mkdir -p /var/www/certbot
sudo chown -R www-data:www-data /var/www/certbot

5. 配置 APISIX 支持 Webroot 验证

需要在 APISIX 中配置一个路由,将 /.well-known/acme-challenge/ 请求转发到 webroot 目录。

使用方法

手动申请证书

# 申请单个域名证书
python3 ssl_manager.py request --domain example.com

# 申请多域名证书
python3 ssl_manager.py request --domain example.com --additional-domains www.example.com api.example.com

手动续期证书

# 续期单个域名
python3 ssl_manager.py renew --domain example.com

# 续期所有证书
python3 ssl_manager.py renew-all

同步现有证书到 APISIX

python3 ssl_manager.py sync --domain example.com

检查证书过期时间

python3 ssl_manager.py check --domain example.com

启动路由监听服务

# 持续监听(每 60 秒检查一次)
python3 route_watcher.py

# 只执行一次
python3 route_watcher.py --once

# 自定义检查间隔
python3 route_watcher.py --interval 30

自动续期配置

方法一:使用 Certbot 自动续期 + 部署钩子

  1. 配置 Certbot 自动续期:
# 编辑 Certbot 续期配置
sudo nano /etc/letsencrypt/renewal/example.com.conf

在配置文件中添加部署钩子:

[renewalparams]
deploy_hook = /home/jingrow/apisix/ssl_manager/certbot_deploy_hook.sh
  1. 测试续期:
sudo certbot renew --dry-run
  1. 设置 systemd timer推荐

创建 /etc/systemd/system/certbot-renew.timer

[Unit]
Description=Certbot Renewal Timer

[Timer]
OnCalendar=daily
RandomizedDelaySec=3600
Persistent=true

[Install]
WantedBy=timers.target

创建 /etc/systemd/system/certbot-renew.service

[Unit]
Description=Certbot Renewal Service
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --quiet --deploy-hook /home/jingrow/apisix/ssl_manager/certbot_deploy_hook.sh

启用定时器:

sudo systemctl enable certbot-renew.timer
sudo systemctl start certbot-renew.timer

方法二:使用自定义脚本 + systemd timer

创建 /etc/systemd/system/apisix-ssl-renew.service

[Unit]
Description=APISIX SSL Certificate Renewal
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/python3 /home/jingrow/apisix/ssl_manager/ssl_manager.py renew-all
User=root

创建 /etc/systemd/system/apisix-ssl-renew.timer

[Unit]
Description=APISIX SSL Certificate Renewal Timer

[Timer]
OnCalendar=weekly
RandomizedDelaySec=3600
Persistent=true

[Install]
WantedBy=timers.target

启用:

sudo systemctl enable apisix-ssl-renew.timer
sudo systemctl start apisix-ssl-renew.timer

路由监听服务

路由监听服务会自动检测新创建的路由,并为其中的域名申请证书。

启动服务

# 使用 systemd推荐
sudo systemctl start apisix-route-watcher.service

# 或使用 screen/tmux
screen -S route-watcher
python3 route_watcher.py

创建 systemd 服务

创建 /etc/systemd/system/apisix-route-watcher.service

[Unit]
Description=APISIX Route Watcher Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/python3 /home/jingrow/apisix/ssl_manager/route_watcher.py
Restart=always
RestartSec=10
User=root

[Install]
WantedBy=multi-user.target

启用服务:

sudo systemctl enable apisix-route-watcher.service
sudo systemctl start apisix-route-watcher.service

环境变量配置

也可以通过环境变量配置:

export APISIX_ADMIN_URL="http://localhost:9180"
export APISIX_ADMIN_KEY="your-admin-key"
export LETSENCRYPT_EMAIL="your-email@example.com"
export LETSENCRYPT_STAGING="false"
export WEBROOT_PATH="/var/www/certbot"

注意事项

  1. 首次使用建议使用 staging 模式测试

    "letsencrypt_staging": true
    
  2. 确保 80 端口可访问Let's Encrypt 需要验证域名所有权,通常使用 HTTP-01 验证方式。

  3. DNS 验证:如果无法使用 HTTP-01 验证,可以配置 DNS-01 验证(需要修改脚本)。

  4. 证书存储:证书存储在 /etc/letsencrypt/live/ 目录,请确保有备份。

  5. 日志位置

    • SSL 管理器日志:/var/log/apisix-ssl-manager.log
    • 路由监听日志:/var/log/apisix-route-watcher.log
    • Certbot 部署钩子日志:/var/log/apisix-certbot-deploy.log

故障排查

证书申请失败

  1. 检查域名 DNS 解析是否正确
  2. 检查 80 端口是否可访问
  3. 检查 webroot 目录权限
  4. 查看 Certbot 日志:/var/log/letsencrypt/letsencrypt.log

证书无法同步到 APISIX

  1. 检查 APISIX Admin API 是否可访问
  2. 检查 Admin Key 是否正确
  3. 查看 SSL 管理器日志

自动续期不工作

  1. 检查 systemd timer 状态:systemctl status certbot-renew.timer
  2. 手动测试续期:certbot renew --dry-run
  3. 检查部署钩子脚本权限:chmod +x certbot_deploy_hook.sh

测试

测试环境staging

"letsencrypt_staging": true

Staging 环境有更高的申请频率限制,适合测试。

生产环境

测试通过后,设置:

"letsencrypt_staging": false

许可证

Apache License 2.0