Как настроить HTTPS на qbittorrent WebUI с помощью letsencrypt / certbot?

1937
Frank

Я работаю qbittorrent-noxна сервере Ubuntu (16.04).

Я использую динамический DNS-адрес для доступа к WebUI.

На странице github есть руководство по настройке HTTPS, но только с использованием самозаверяющих сертификатов.

Я уже пробовал использовать certbotс --webrootи --standaloneвариантов, но безрезультатно. Одна из главных проблем заключается в том, что я не могу понять, откуда на самом деле обслуживаются файлы для веб-интерфейса, иначе --webrootдолжно работать.

Может кто-нибудь объяснить, как я могу заставить его работать?

2

1 ответ на вопрос

3
Matteo Pergolesi

Мне удалось сделать это на Archlinux, но я думаю, что это будет то же самое на Ubuntu.

Запрос сертификата

Запустите certbot следующим образом:

sudo certbot certonly --manual -d yourhostname.org 

Следуй инструкциям. В какой-то момент certbot скажет вам запустить веб-сервер, чтобы подтвердить ваше имя хоста. Он также предоставит пару команд для запуска простого веб-сервера с python. Запустите эти команды от имени пользователя root в новой оболочке на вашем сервере.

Обязательно перенаправьте порт 80с вашего маршрутизатора на хостинг сервера qbittorrent-noxи откройте тот же порт на брандмауэре вашего сервера. Если вы используете ufwэту команду, вы хотите:

sudo ufw allow WWW 

WWW простая конфигурация, позволяющая подключаться к порту 80

После завершения процедуры проверки вы найдете файлы ключей и сертификатов в /etc/letsencrypt/live/yourhostname.org. Скопируйте / вставьте privkey.pemи cert.pemв свой qbittorrent-noxвеб-интерфейс, и все готово.

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 Docs для более подробной информации.

Скрипты помещены в /etc/letsencrypt/scripts. Создайте эту папку и поместите туда свои скрипты или используйте любую другую папку по вашему выбору.

Сценарии объяснения и код:

auth-hook.shвыполняется до процедуры проверки. Он устанавливает простой веб-сервер для предоставления 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будет выполнен после процедуры проверки независимо от того, был ли сертификат продлен или нет. Мы используем его для очистки веб-сервера.

#!/bin/zsh   kill $(ps aux | grep SimpleHTTPServer | awk 'NR==1')   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.

Спасибо, похоже, это сработало. Последний вопрос: работает ли автообновление? Нужен ли веб-сервер Python для порта 80, чтобы он работал? Frank 6 лет назад 0
Наверное. Система проверки должна быть такой же, но я не пробовал продление. Я сделаю это, когда у меня будет время, и я дам тебе знать. Matteo Pergolesi 6 лет назад 1
Хорошо, тогда я буду ждать ваших результатов. Между тем, похоже, все работает нормально, поэтому я приму ваш ответ. Большое спасибо! Frank 6 лет назад 0
@Frank Я обновил свой ответ сценариями и информацией для настройки автоматического обновления. Скрипты также обновят конфигурацию `qbittorrent`. Надеюсь, поможет :) Matteo Pergolesi 6 лет назад 1
Хорошо, вы сами проверили автоматическое обновление? Весь этот пост будет отличным дополнением к вики qBittorrent на Github, если у вас будет время связаться с сопровождающими. Прекрасная работа! Frank 6 лет назад 0
@Frank Сегодня я исправил несколько ошибок в скрипте Python. Я также добавил остановку / перезагрузку сервиса при изменении файла конфигурации. Конечно, я все это проверил. Я свяжусь с сопровождающими как можно скорее. Matteo Pergolesi 6 лет назад 0