Answers:
我设法在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.pem
并cert.pem
在您的qbittorrent-nox
web-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作业。
# 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作业更好。
qbittorrent
配置。希望它