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


2

qbittorrent-nox在Ubuntu服务器(16.04)上运行。

我使用动态DNS地址来访问WebUI。

在github页面中有一个设置HTTPS的教程,但只使用自签名证书。

使用我已经尝试certbot--webroot--standalone选项,但无济于事。其中一个主要问题是我无法弄清楚webUI的文件实际上是从哪里提供的,否则--webroot应该可以工作。

有人可以解释一下我是如何让它起作用的吗?

Answers:


3

我设法在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-ui中完成。

PS。在这结束时你可以杀死python webserver。

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 docs

脚本被放入/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 Job

如果一切正常,您可以设置一个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 docs建议)。

我们添加--quiet选项:对于cron作业更好。


谢谢,这似乎有效。最后一个问题:自动续订是否有效?我是否需要端口80上的python webserver才能工作?
弗兰克

1
大概。验证系统应该是相同的,但我没有尝试续订。我有空的时候会这样做,我会告诉你的。
Matteo Pergolesi

好的,我会等你的结果。同时一切似乎都很好,所以我接受你的回答。非常感谢你!
弗兰克

1
@Frank我用脚本和信息更新了我的答案,以设置自动续订。脚本还将更新qbittorrent配置。希望它
有所

好的,你自己测试了自动更新吗?如果您有时间联系维护人员,这整篇文章将是对Github上qBittorrent维基的一个很好的补充。很好!
弗兰克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.