fnos目前还未开放acme自动更新证书的接口,我这里使用python selenium库实现了一个自动更新证书的脚本
安装依赖
- 登录 ssh
- 安装python selenium库
sudo apt-get install python3-selenium
在 web 配置界面新增证书
该脚本的原理是模拟浏览器登录fnos后台并更新证书的过程,因此需要手动新增证书,使得页面出现证书编辑按钮

保存脚本与配置
在任意目录保存示例更新脚本 \path\update.py
from selenium import webdriver
from selenium.webdriver.chromium.service import ChromiumService
from selenium.webdriver.common.by import By
import json
import os
dir = os.path.dirname(__file__)
config = json.loads(open(os.path.join(dir, 'config.json')).read()) # 运行时目录下的 config.json
service = ChromiumService(executable_path='/usr/bin/chromedriver')
options = webdriver.ChromeOptions()
options.add_argument("--headless") # 启用无头模式
options.add_argument("--disable-gpu") # 禁用GPU加速
options.add_argument("--no-sandbox") # 禁用沙箱模式,解决某些环境下的启动问题
driver = webdriver.Chrome(service=service, options=options)
driver.implicitly_wait(10) # 最多等待 10 秒
driver.set_window_size(1400, 800)
driver.get('http://127.0.0.1:5666')
# login
user = config['user']
driver.find_element(By.ID, 'username').send_keys(user['username'])
driver.find_element(By.ID, 'password').send_keys(user['password'])
driver.find_element(By.XPATH, "//span[text()='登录']").click()
# settings
driver.find_element(By.XPATH, "//div[text()='系统设置']").click()
driver.find_element(By.XPATH, "//div[text()='安全性']").click()
driver.find_element(By.XPATH, "//div[text()='证书']").click()
# cert
cert = config['cert']
driver.find_element(By.XPATH, f"//div[div/div/div/span[text()='{cert['name']}']]//span[text()='编辑']").click()
driver.find_element(By.XPATH, "//div[label/div[text()='证书 ']]//div//input").send_keys(cert['cert'])
driver.find_element(By.XPATH, "//div[label/div[text()='私钥']]//div//input").send_keys(cert['key'])
driver.find_element(By.XPATH, "//span[text()='确认']").click()
print('done')
同时,在相同目录下保存配置文件 \path\config.json
{
"user": {
"username": "username",
"password": "password"
},
"cert": {
"name": "example.com",
"cert": "/path/example.com.crt",
"key": "/path/example.com.key"
}
}
其中包括
user:
username: fnos管理员用户的用户名
passward: 密码
cert:
name: 上一步手动新增证书的描述
cert: 证书路径
key: 私钥路径
安装acme.sh
这里可以参考 这篇文章 进行安装
部署证书
在 acme.sh 的更新命令中执行脚本即可
acme.sh --install-cert -d example.com \
--fullchain-file /path/example.com.crt --key-file /path/example.com.key \
--reloadcmd "python3 \path\update.py"
|