web-dev-qa-db-ja.com

Letsencrypt / certbotを使用してqbittorrent WebUIでHTTPSを設定するにはどうすればよいですか?

Ubuntuサーバー(16.04)でqbittorrent-noxを実行しています。

ダイナミックDNSアドレスを使用してWebUIにアクセスします。

Githubページには、HTTPSを設定するためのチュートリアルがありますが、自己署名証明書のみを使用しています。

certbot--webrootおよび--standaloneオプションとともに使用しようとしましたが、役に立ちませんでした。主な問題の1つは、webUIのファイルが実際にどこから提供されているのかわからないことです。そうしないと、--webrootが機能するはずです。

誰かが私がそれを機能させる方法を説明できますか?

2
Frank

Archlinuxでもこれを行うことができましたが、Ubuntuでも同じだと思います。

証明書要求

次のようにcertbotを実行します。

Sudo certbot certonly --manual -d yourhostname.org

指示に従ってください。ある時点で、certbotは、ホスト名を所有していることを確認するためにWebサーバーを実行するように指示します。また、Pythonで単純なWebサーバーを実行するためのコマンドもいくつか提供されます。これらのコマンドを、サーバー上の新しいシェルでrootとして実行します。

必ずポート80をルーターからqbittorrent-noxをホストしているサーバーに転送し、サーバーファイアウォールで同じポートを開いてください。 ufwを使用する場合、これは必要なコマンドです。

Sudo ufw allow WWW

WWWは、ポート80での接続を許可するための単純な構成です。

検証手順が完了すると、キーファイルと証明書ファイルが/etc/letsencrypt/live/yourhostname.orgにあります。 privkey.pemcert.pemqbittorrent-nox web-uiにコピーして貼り付けると、完了です。

PS。この最後に、pythonWebサーバーを強制終了できます。

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を公開するための単純なWebサーバーをセットアップします。

#!/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.pyqBittorrent.confを更新します。 ConfigParserモジュールがpythonファイル(key=value)を編集するのに非常に便利だったので、INIを使用しました。私より賢い人は、おそらく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ジョブ

すべて問題がなければ、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ジョブに適しています。

3