默认自定义申请的证书 免费时间为90天 一般默认2个月就去申请更新一下
业务服务域名 最好选择晚上 因为脚本内会停止nginx访问 不过也很快
申请ssl
脚本内自动去更新 更新后 推送到手机上通知
pythonimport subprocess
import psutil # pip install psutil
import requests
def create_content(ipAddr, domain, content="证书更新成功,已完成自动续期。"):
return f"""
[IP] {ipAddr} \n
[域名] {domain} \n
[内容] {content}
"""
def push_deer_func(ipAddr, domain):
"""
调用推送服务,如 PushDeer,将通知推送到手机
"""
title = "域名SSL更新"
pushKey = "PDUxxxZgH" # 替换为你的 PushDeer PushKey
data = {
"text": title,
"desp": create_content(ipAddr, domain), # 组织推送消息
"type": "markdown",
"pushkey": pushKey,
}
url = 'https://api2.pushdeer.com/message/push'
try:
response = requests.post(url, data=data).json()
if response.get("content"):
print("推送成功:", response["content"])
else:
print("推送失败:", response)
except Exception as e:
print(f"推送时发生错误: {e}")
def stop_web_service():
"""
停止 Web 服务,确保 Certbot 可以绑定到 80/443 端口
"""
print("正在停止 nginx服务...")
subprocess.run(["sudo", "systemctl", "stop", "nginx"], check=True) # 如果是Apache则用apache2
def start_web_service():
"""
启动 Web 服务
"""
print("正在启动 nginx服务...")
subprocess.run(["sudo", "systemctl", "start", "nginx"], check=True) # 如果是Apache则用apache2
def renew_ssl_certificate():
"""
执行证书续期操作,并根据是否更新成功返回结果
返回值:
- True: 说明有证书被更新
- False: 没有证书需要更新
"""
print("检查并更新 SSL 证书...")
try:
# 捕获 certbot renew 完整输出
result = subprocess.run(
["sudo", "certbot", "renew"],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True, # 捕获结果为文本
)
output = result.stdout
# 分析输出,判断是否有证书更新
if "No renewals were attempted" in output or "no renewal failures" in output:
print("没有证书需要更新。")
return False
elif "Congratulations, all renewals succeeded" in output or "successfully renewed" in output:
print("SSL 证书更新完成!")
return True
else:
print("证书更新时可能发生了问题,请检查输出:")
print(output)
return False
except subprocess.CalledProcessError as e:
print("Failed to renew SSL certificate")
print(e)
return False
def process_exists(process_name):
"""
检查是否有特定名称的进程正在运行
"""
for proc in psutil.process_iter(['name']):
if proc.info['name'] == process_name:
return True
return False
if __name__ == "__main__":
# 检查 Web 服务是否运行
if process_exists("nginx"): # 替换为你的 Web 服务进程名称,如 "nginx" 或 "apache2"
stop_web_service()
# 尝试更新证书
updated = renew_ssl_certificate()
# 无论是否更新成功,都尝试重启 Web 服务
start_web_service()
# 如果证书更新成功,则推送消息
if updated:
push_deer_func(
ipAddr="ip地址",
domain="[域名] www, api, img",
)
else:
print("无证书需要更新,未推送通知。")
# 0 3 * * * /usr/bin/python3 /path/to/your_script.py
此方式使用方法自行百度
shell0 2 * * * /usr/bin/python3 /home/script_job/check_renew.py 0:分钟字段,表示在每小时的第 0 分钟。 3:小时字段,表示在每天的第 3 小时(也就是凌晨 3 点)。 15:日期字段,表示每月的第 15 天。 */2:月份字段,表示每两个月。* 表示任何月份,/2 表示步长为 2,所以这个字段表示每两个月。 *:星期字段,表示每星期。 /usr/bin/python3 /home/script_job/check_renew.py:这是命令部分,表示需要执行的命令或脚本。 这里的命令是使用 /usr/bin/python3(Python3 的路径) 来执行位于 /home/script_job/check_renew.py 的 Python 脚本。
本文作者:Freed
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!