一个脚本解决每次证书到期后需要手动更新证书到ikuai的痛点
说明
本脚本无需SSH/Telnet连接,而是通过模拟iKuai Web端请求实现证书上传。
场景
- 定时任务推送创建系统定时任务定期执行脚本
- 1Panel联动推送(推荐教程方式)在1Panel申请证书后,通过其
执行脚本功能自动触发本脚本
脚本
代码中需要根据自身情况填写5处地方才可以正常使用。
(代码中有明确标注!!!)
- 填写证书及私钥的存放路径
- 填写iKuai的ip
- 填写证书文件名
- 填写私钥文件名
- 填写ikuai admin账户的密码
import hashlib
import base64
import requests
# --------------------------------需指定参数--------------------------------------
ssl_path = r"/usr/trim/var/trim_connect/ssls/yuaxi.cn/1754736506" # 证书存放的路径(绝对路径)
iKuai_ip = "10.0.0.2" #ikaui的ip
cert_name = "fullchain.pem" # 证书文件名
key_name = "privkey.pem" # 私钥文件名
password = "************" # iKuai admin账户密码
# ------------------------------------------------------------------------------
salt = "salt_11"
passwdMd5 = hashlib.md5(password.encode("utf-8")).hexdigest()
passBase64 = base64.b64encode((salt + password).encode("utf-8")).decode()
login_url = f"https://{iKuai_ip}/Action/login"
login_data = {
"username": "admin",
"passwd": passwdMd5,
"pass": passBase64,
"remember_password": "true"
}
session = requests.Session()
status = session.post(url=login_url, json=login_data, verify=False)
ssl_url = f"https://{iKuai_ip}/Action/call"
with open(rf"{ssl_path}/{cert_name}", "r") as f:
ssl_cert = f.read().replace(' ', '#').replace('n', '@')
with open(rf"{ssl_path}/{key_name}", "r") as f:
priv_key = f.read().replace(' ', '#').replace('n', '@')
ssl_data = {
"func_name": "key_manager",
"action": "save",
"param": {
"ca": ssl_cert, # 证书
"key": priv_key, # 私钥
"id": 1,
"enabled": "yes", # 是否启用
"comment": "yuaxi.cn" # 备注
}
}
result = session.post(url=ssl_url, json=ssl_data, verify=False)
print(result.text)
上传脚本
可以通过ssh的方式或者直接在1panel的web界面左侧菜单栏主机->文件中选择一个文件夹后点击创建输入文件名.py之后将代码粘贴进去。需要记住脚本所在的绝对路径。
配置1Panel
进入1panel后在左侧菜单栏网站->证书中可以看到你已经申请的证书,点击你需要上传到ikuai的证书右侧的编辑,勾选申请证书后执行脚本并在输入框中输入下面的命令
sudo python3 绝对路径/脚本名.py
之后点击确认可在日志中查看是否执行成功,如果成功则返回“{“Result”:30000,”ErrMsg”:”Success”}”
你好,很高兴能看到你的这篇文章,但是我实测发现登录是正确的,返回
{“ErrMsg”:”Success”,”Result”:10000}
但是post证书时会报错:
{“ErrMsg”:”Invalid characters: —–BEGIN#CERTIFICATE—–nMIIFAjCCA+qgAwIBAgISBtwRfy2…..”Result”:10013}
请问有什么思路吗,是不是参数还是不对
import hashlib
import base64
import requests
ssl_path = r”/etc/ohttps/certificates/cert/”
iKuai_ip = “10.10.10.253:1443”
cert_name = “fullchain.cer”
key_name = “cert.key”
password = “mima1111”
——————————————————————————
salt = “salt_11”
passwdMd5 = hashlib.md5(password.encode(“utf-8”)).hexdigest()
passBase64 = base64.b64encode((salt + password).encode(“utf-8″)).decode()
login_url = f”https://{iKuai_ip}/Action/login”
login_data = {
“username”: “admin”,
“passwd”: passwdMd5,
“pass”: passBase64,
“remember_password”: “true”
}
session = requests.Session()
status = session.post(url=login_url, json=login_data, verify=False)
print(status.text)
ssl_url = f”https://{iKuai_ip}/Action/call”
with open(rf”{ssl_path}/{cert_name}”, “r”) as f:
ssl_cert = f.read().replace(‘ ‘, ‘#’).replace(‘n’, ‘@’)
with open(rf”{ssl_path}/{key_name}”, “r”) as f:
priv_key = f.read().replace(‘ ‘, ‘#’).replace(‘n’, ‘@’)
ssl_data = {
“func_name”: “key_manager”,
“action”: “save”,
“param”: {
“ca”: ssl_cert,
“key”: priv_key,
“id”: 1,
“enabled”: “yes”,
“comment”: “openwrt”
}
}
result = session.post(url=ssl_url, json=ssl_data, verify=False)
print(result.text)
有几个地方需要确认无误。第一你的证书和密钥是否都在/etc/ohttps/certificates/cert/下,第二要确保证书和密钥的格式是正确的,你可以直接复制证书和密钥到ikuai里面提交验证一下。如果还是不能解决可以在网站首页添加我的b站好友方便协助你排查问题。