如何使用 letsencrypt/certbot 在 qbittorrent WebUI 上设置 HTTPS?

如何使用 letsencrypt/certbot 在 qbittorrent WebUI 上设置 HTTPS?

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.pemcert.pem您的qbittorrent-noxWeb 用户界面中,您就完成了。

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 作业。

相关内容