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.