qbittorrent-nox
我在 Ubuntu 服务器(16.04)上运行。
我使用动态 DNS 地址访问 WebUI。
在 github 页面上有一个设置 HTTPS 的教程,但只能使用自签名证书。
我已经尝试使用和certbot
选项,但无济于事。主要问题之一是我无法弄清楚 webUI 的文件实际上是从哪里提供的,否则应该可以工作。--webroot
--standalone
--webroot
有人可以解释一下我该如何让它工作吗?
答案1
我设法在 Archlinux 上完成了此操作,但我认为在 Ubuntu 上也是一样的。
证书请求
像这样运行 certbot:
sudo certbot certonly --manual -d yourhostname.org
按照说明操作。在某个时候,certbot 会提示您运行 Web 服务器以验证您是否拥有主机名。它还会提供一些命令来使用 python 运行简单的 Web 服务器。在服务器上的新 shell 中以 root 身份运行这些命令。
确保将端口80
从路由器转发到服务器托管qbittorrent-nox
,并在服务器防火墙上打开相同的端口。如果使用ufw
,这是您需要的命令:
sudo ufw allow WWW
WWW
是允许端口 80 上的连接的简单配置。
验证过程完成后,您将在中找到密钥和证书文件/etc/letsencrypt/live/yourhostname.org
。将其复制/粘贴privkey.pem
到cert.pem
您的qbittorrent-nox
Web 用户界面中,您就完成了。
PS. 最后你可以终止 python 网络服务器。
PPS。如果您没有80
在服务器上使用端口,您也可以将其从ufw ALLOW
规则和路由器的端口转发中删除。
证书自动续订
基本上,您需要自动执行上一节中介绍的步骤。
要执行的命令是这样的:
certbot renew
--manual-auth-hook /etc/letsencrypt/scripts/auth-hook.sh \
--manual-cleanup-hook /etc/letsencrypt/scripts/cleanup-hook.sh \
--post-hook /etc/letsencrypt/scripts/post-hook.sh
这些hooks
基本上是 certbot 执行的脚本。certbot 会将一些环境变量导出到脚本中。请参阅certbot 文档更多细节。
脚本放置在 中/etc/letsencrypt/scripts
。创建此文件夹并将脚本放置在那里,或者使用您选择的任何其他文件夹。
脚本解释及代码:
auth-hook.sh
在验证程序之前执行。它设置了一个简单的 Web 服务器来公开 CERTBOT_TOKEN。
#!/bin/zsh
ufw allow WWW
mkdir -p /tmp/certbot/public_html/.well-known/acme-challenge
cd /tmp/certbot/public_html
printf "%s" $CERTBOT_VALIDATION > .well-known/acme-challenge/$CERTBOT_TOKEN
$(command -v python2 || command -v python2.7 || command -v python2.6) -c "import BaseHTTPServer, SimpleHTTPServer; s = BaseHTTPServer.HTTPServer(('', 80), SimpleHTTPServer.SimpleHTTPRequestHandler); s.serve_forever()" &> /dev/null &
cleanup-hook.sh
无论证书是否已更新,都将在验证过程之后执行。我们使用它来清理 Web 服务器。
#!/bin/zsh
kill $(ps aux | grep SimpleHTTPServer | awk 'NR==1{print $2}')
rm -rf /tmp/certbot/public_html/.well-known/acme-challenge
ufw delete allow WWW
post-hook.sh
将在证书实际更新时执行。我们用它来更新/home/user/.config/qBittorrent/qBittorrent.conf
。
#!/bin/zsh
systemctl stop qbittorrent.service &&
/etc/letsencrypt/scripts/update_config.py \
--hostname $CERTBOT_DOMAIN \
--configfile /home/user/.config/qBittorrent/qBittorrent.conf &&
systemctl start qbittorrent.service &&
请注意:qbittorrent
配置放在运行它的用户的主文件夹中;根据您的配置编辑此脚本。
update_config.py
更新qBittorrent.conf
。我使用 python 是因为 ConfigParser 模块非常方便编辑 INI 文件(key=value
)。比我聪明的人可能可以用sed
或实现相同的功能awk
。
#!/usr/bin/python3
import argparse
import configparser
Config = configparser.ConfigParser()
Config.optionxform = str
parser = argparse.ArgumentParser(description='Updates qbittorrent config.')
parser.add_argument('--hostname', required=True)
parser.add_argument('--configfile', required=True)
args = parser.parse_args()
with open('/etc/letsencrypt/live/' + args.hostname + '/cert.pem', 'r') as f:
cert = f.read()
with open('/etc/letsencrypt/live/' + args.hostname + '/privkey.pem', 'r') as f:
key = f.read()
cert = cert.replace('\n', '\\n')[:-2]
cert = "\"@ByteArray(" + cert + ")\""
key = key.replace('\n', '\\n')[:-2]
key = "@ByteArray(" + key + ")"
Config.read(args.configfile)
Config["Preferences"]["WebUI\HTTPS\Certificate"] = cert
Config["Preferences"]["WebUI\HTTPS\Key"] = key
with open(args.configfile, 'w') as f:
Config.write(f, space_around_delimiters=False)
试运行
根据需要编辑这些脚本。现在尝试使用--dry-run
选项运行上一个命令。即使证书尚未过期,这也将运行续订程序。
certbot renew --manual-auth-hook /etc/letsencrypt/scripts/auth-hook.sh --manual-cleanup-hook /etc/letsencrypt/scripts/cleanup-hook.sh --post-hook /etc/letsencrypt/scripts/post-hook.sh --dry-run
计划任务
如果一切顺利,您可以设置一个 cron 作业。
# EDITOR=vim crontab -e
00 04,16 * * * sleep $((RANDOM % 60)); certbot renew --quiet --manual-auth-hook /etc/letsencrypt/scripts/auth-hook.sh --manual-cleanup-hook /etc/letsencrypt/scripts/cleanup-hook.sh --post-hook /etc/letsencrypt/scripts/post-hook.sh
该作业将在每天 04:00 和 16:00 运行。随机睡眠将在所选小时内随机选择一个分钟(如建议的那样certbot 文档)。
我们添加了--quiet
选项:它更适合 cron 作业。