Como configurar o HTTPS no qbittorrent WebUI com o letsencrypt / certbot?

2

Estou executando qbittorrent-nox em um servidor Ubuntu (16.04).

Eu uso um endereço DNS dinâmico para acessar a WebUI.

Na página do github há um tutorial para configurar o HTTPS, mas somente usando certificados auto-assinados.

Eu já tentei usar certbot com as opções --webroot e --standalone , mas sem sucesso. Um dos principais problemas é que não consigo descobrir de onde os arquivos da webUI estão sendo servidos, caso contrário --webroot deve funcionar.

Alguém por favor pode explicar como posso fazer isso funcionar?

    
por Frank 02.05.2017 / 02:45

1 resposta

3

Eu consegui fazer isso no Archlinux, mas acho que seria o mesmo no Ubuntu.

Solicitação de certificado

Execute o certbot da seguinte forma:

sudo certbot certonly --manual -d yourhostname.org

Siga as instruções. Em algum momento, o certbot irá dizer-lhe para executar um servidor web para verificar se você possui o nome do host. Ele também fornecerá alguns comandos para executar um servidor web simples com python. Execute esses comandos como root em um novo shell no seu servidor.

Não se esqueça de encaminhar a porta 80 do roteador para o servidor que hospeda qbittorrent-nox e para abrir a mesma porta no firewall do servidor. Se estiver usando ufw , este é o comando que você deseja:

sudo ufw allow WWW

WWW é uma configuração simples para permitir conexões na porta 80.

Quando o procedimento de verificação estiver concluído, você encontrará os arquivos de chave e certificado em /etc/letsencrypt/live/yourhostname.org . Copie / cole privkey.pem e cert.pem no seu qbittorrent-nox web-ui e está pronto.

PS. No final, você pode matar o servidor web python.

PPS. Se você não estiver usando a porta 80 em seu servidor, também poderá removê-la das regras ufw ALLOW e do encaminhamento de porta do seu roteador.

Renovação automática do certificado

Basicamente, você precisa automatizar as etapas apresentadas na seção anterior.

O comando para executar é este:

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

Os hooks são basicamente scripts executados pelo certbot. O certbot exportará algumas variáveis de ambiente para os scripts. Consulte os documentos do certbot para obter mais detalhes.

Os scripts são colocados em /etc/letsencrypt/scripts . Crie esta pasta e coloque seus scripts lá ou use qualquer outra pasta de sua escolha.

Explicação e código dos scripts:

auth-hook.sh é executado antes do procedimento de verificação. Ele configura um servidor web simples para expor o 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 será executado após o procedimento de verificação, independentemente de o certificado ter sido renovado ou não. Nós o usamos para limpar o servidor 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 será executado quando o certificado for realmente renovado. Usamos para atualizar /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 &&

Por favor, note : qbittorrent configuration é colocado na pasta home do usuário que o está executando; edite esse script de acordo com sua configuração.

update_config.py atualiza o qBittorrent.conf . Eu usei python porque o módulo ConfigParser era muito conveniente para editar arquivos INI ( key=value ). Alguém mais esperto do que eu provavelmente conseguirá o mesmo com sed ou 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)

Corrida a seco

Edite esses scripts de acordo com suas necessidades. Agora tente executar o comando anterior com a opção --dry-run . Isso executará o procedimento de renovação, mesmo que o certificado não tenha expirado.

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

Se estiver tudo bem, você pode configurar um cron job.

# 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

O trabalho será executado todos os dias às 04:00 e 16:00. O sono aleatório selecionará um minuto aleatório dentro das horas selecionadas (como sugerido pelos documentos do certbot ).

Adicionamos a opção --quiet : é melhor para tarefas agendadas.

    
por 25.06.2017 / 10:44