python写一个30天内到期的SSL证书会自动续签的代码 自动续签Let‘s Encrypt证书

简介: 本文分享了在宝塔面板中手动实现Let's Encrypt证书自动续签的解决方案。由于原计划任务无法正常续签,作者编写了auto_letsencrypt_v2.py脚本,支持按过期天数(默认30天)自动检测并续签证书,可过滤指定域名,每日夜间执行。脚本包含日志管理、失败跳过、成功后重载Nginx与宝塔面板等功能,有效解决证书过期问题。建议根据实际环境调整路径和排除域名,提升稳定性

背景

我的服务器上安装了宝塔服务器管理系统 ,看到计划任务里有一条任务是 续签Let's Encrypt证书,但是网站ssl证书过期后不会自动续签,也没有查什么原因,写了一个小代码,可以自动续签分享给大家共用,如果你们知道原有的宝塔代码为什么不能续签的原因,也可以后面留言共勉。

操作

把如下代码存入于 /www/server/panel/class/auto_letsencrypt_v2.py , 文件中需要修改你想要指定的过期天数和过滤不续签的域名等。因为这段代码,会读取所有证书夹里的域名,由于有的网站现在不用了,但证书夹里不存在其证书痕迹。可以把不用的网站从证书夹中删除,就不用过滤了。

# -*- encoding: utf-8 -*-
# SSL证书 Let's Encrypt自动续签, 加入计划任务, 每天夜间执行
import json
import time
import subprocess
import os
import glob

conf = "/www/server/panel/config/letsencrypt_v2.json"
log_file = "/www/server/panel/class/renew_cert_log.txt"
# 单日志上限1MB
max_log_size = 1 * 1024 * 1024
# 最多保留10份备份日志
max_backup_count = 10


def write_log(msg):
    if os.path.exists(log_file) and os.path.getsize(log_file) > max_log_size:
        backup_name = log_file + "." + time.strftime("%Y%m%d_%H%M%S")
        os.rename(log_file, backup_name)
        backup_list = sorted(glob.glob(log_file + ".*"))
        if len(backup_list) > max_backup_count:
            for old_file in backup_list[: len(backup_list) - max_backup_count]:
                os.remove(old_file)

    t = time.strftime("%Y-%m-%d %H:%M:%S")
    line = f"[{t}] {msg}"
    print(line)
    with open(log_file, "a", encoding="utf-8") as f:
        f.write(line + "\n")


with open(conf, "r", encoding="utf-8") as f:
    data = json.load(f)

orders = data.get("orders", {
   })
now = int(time.time())
# 续签30天内的,证书在30天内到期的才会续签,这里可以根据自己的需要设置
expire_days = 30
# ==========排除域名列表,在这里的域名不会续签 ==========
exclude_domains = {
   
    "hao366.net",
}
# ==============================
# 标记是否有任意订单续签成功
has_success = False

write_log("===== 证书自动续签任务开始 =====")

for k, v in orders.items():
    cert_timeout = v.get("cert_timeout", 0)
    domains = v.get("domains", [])
    auth_type = v.get("auth_type", "http")
    auth_path = v.get("auth_to", "")

    need_skip = False
    for d in domains:
        if d in exclude_domains:
            need_skip = True
            break
    if need_skip:
        write_log(f"跳过废弃域名订单: {domains}")
        continue

    if not domains or auth_type != "http" or not auth_path:
        write_log(f"跳过非http验证/信息不全订单: {domains}")
        continue

    left = (cert_timeout - now) / 86400
    if left < expire_days:
        domain_str = ",".join(domains)
        write_log(f"开始续签 {domain_str} 剩余{left:.2f}天")
        cmd = [
            "/www/server/panel/pyenv/bin/python3",
            "/www/server/panel/class/acme_v2.py",
            "--domain",
            domain_str,
            "--type",
            "http",
            "--path",
            auth_path,
        ]
        ret = subprocess.run(cmd)
        if ret.returncode == 0:
            write_log(f"✅ {domain_str} 续签成功")
            has_success = True
        else:
            write_log(f"❌ {domain_str} 续签失败!继续下一个订单")

# 全部订单循环结束后,如果有成功,统一执行一次
if has_success:
    write_log("存在续签成功域名,执行nginx重载 + 重载宝塔面板")
    subprocess.run(["systemctl", "reload", "nginx"])
    subprocess.run(["bt", "4"])

write_log("===== 证书自动续签任务结束 =====")

然后在编辑计划任务里的 “续签Let's Encrypt证书” 那条任务,如下

python3 /www/server/panel/class/auto_letsencrypt_v2.py

当然,如果你使用的python虚拟环境,可以根据情况把python3变为你的虚拟环境的地址。搞完每天夜间会执行,下面是执行日志,现在看到的是没有要续签的证书。

运行后的日志

[2026-10-23 03:13:01] ===== 证书自动续签任务开始 =====
[2026-10-23 03:13:01] 跳过废弃域名订单: ['hao366.net']
[2026-10-23 03:13:01] ===== 证书自动续签任务结束 =====
目录
相关文章
|
1天前
|
云安全 安全 网络安全
|
1天前
|
JavaScript 安全 前端开发
Nodejs Brotli decoder 代码执行漏洞 (CVE-2026-111497)10629
Node.js发布安全更新修复Brotli解码器高危RCE漏洞(CVE-2026-111497),建议受影响版本用户立即升级。
1591 0
|
7天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
1292 27
|
3天前
|
存储 人工智能 自然语言处理
阿里云千问办公官网登录入口:qwenwork.cn网页版免下载,注册送2000积分、登录每日再送100积分
千问办公(QwenWork)是阿里巴巴推出的一站式AI办公平台,定位"不止于对话,更注重交付"。它基于千问大模型,具备任务拆解与多步骤自动执行能力,用户一句话即可完成PPT生成、数据分析、网页搭建、视频剪辑、信息调研等复杂任务,覆盖网页端、桌面端及钉钉生态。网页版免下载,访问qwenwork.cn注册即得2000积分,每日登录再送100积分。个人版免费起用,另有付费版与企业版可选。
|
12天前
|
存储 人工智能 安全
千问办公官网入口网页版登录:qwenwork.cn 注册送2000积分、登录送100积分
阿里云千问办公(QwenWork)是AI智能工作平台,支持一句话生成PPT、表格、网页、视频及数据分析。个人免费版送2000积分+每日登录赠100分,含1GB存储、5个发布页;企业版198元/席/月起。阿里千问办公QwenWork官网:https://t.aliyun.com/U/0VCTGt 阿里AI工作平台,一句话完成数据分析、PPT 生成、视频剪辑、网页搭建等复杂任务
|
7天前
|
人工智能 开发者
Qoder CN 大使计划正式开启|无限创造,等你一起
全年免费积分、优先内测、活动支持与更多共创机会,邀请用 Qoder 把想法变成现实的你。
609 6
|
9天前
|
安全 Linux 芯片
【万字长文】Ollama下载、安装、配置、使用保姆级教程(2026最新图解)
Ollama 是一款免费开源的本地大模型运行工具,支持 DeepSeek、Qwen 等主流模型,一条命令即可下载运行。2026 最新版 v0.35.1 官方安装包(1.47GB)已提供国内直连下载,纯本地、离线可用、无广告、无隐私泄露风险。
834 2
|
1月前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
10102 33
|
1天前
|
安全 应用服务中间件 Go
PHP2Shell 漏洞拆解:WordPress 与 nginx 为何中招
PHP2Shell 双 RCE 已遭在野利用:WordPress、Drupal 全在射程内,nginx 其实另有洞。拆成因与修复顺序
PHP2Shell 漏洞拆解:WordPress 与 nginx 为何中招
|
9天前
|
Web App开发 人工智能 JavaScript
太猛了,一个月干到15W+,给大家推荐一个最近爆火的开源逆向工具:REA
REA(Reverse Engineer Anything)是近期爆火的开源AI逆向工具,4月发布,1个月内斩获15万+ Star。它让AI Agent无需源码即可分析二进制、APK、JS/Electron、HAR包等17类目标,自动反编译、生成可运行代码,并强制返回带证据与局限的结论。全本地执行,MIT协议,支持Hopper/Ghidra/IDA等引擎,一行命令即可上手。
841 2
太猛了,一个月干到15W+,给大家推荐一个最近爆火的开源逆向工具:REA

热门文章

最新文章