前言
环境
- 宝塔面板版本:Linux面板7.9.49 测试版
- 手机堡塔APP版本:3.8.2
- 面板堡塔APP插件版本:1.1
设置缘由
反代后只有80/443开放,可以避开恶意扫描,而开启HTTPS可以提升面板访问安全性。
同时,服务器防火墙放开宝塔端口,阿里云安全组禁用宝塔端口,即使后续遇到问题也可通过设置安全组使用原端口登录。
查找原因
安装堡塔APP插件后,会弹出绑定窗口,如图所示:
通过解码绑定二维码,得到一串Base64编码的字符串:
aHR0cCUzQS8vd3d3LmV4YW1wbGUuY29tJTdDMDdIdUo3NUZUbkk5b2Y0d3M5TzBIbkJWQ1JwdUY1MG4lN0M2NDlsNUxvaU42NEZWQ0RFMmQlN0NBS29KYkc1NkZsOWZSN2h2RVU=
通过Base64解码后结果如下:
http://www.example.com|07HuJ75FTnI9of4ws9O0HnBVCRpuF50n|649l5LoiN64FVCDE2d|AKoJbG56Fl9fR7hvEU
前面两个分别是URL和密钥,可以看到即使使用HTTPS访问面板,绑定二维码的URL也是HTTP而不是HTTPS。
经过测试,直接更改成HTTPS后生成二维码无法绑定,基本可以确定后面两项是签名或类似的东西,因此需要通过修改代码来解决。
经过翻找,宝塔获取面板地址的代码在/www/server/panel/class/public.py
的第842行:
# 获取面板地址
def getPanelAddr():
from flask import request
protocol = 'https://' if os.path.exists("data/ssl.pl") else 'http://'
return protocol + request.headers.get('host')
可以看到,面板地址的https
或http
取决于是否存在data/ssl.pl
文件。
这个文件显然是通过面板设置
开启SSL后才会生成的,通过反代开启的SSL并不会生成。
解决问题
我们的目标是生成带https的绑定二维码并且绑定所以方法很简单。
只要把protocol写死为https://绑定后再恢复,问题解决,剩下的就看宝塔开发是否认为这是BUG并修复了。
步骤
将上面那段源码改成如下:
# 获取面板地址
def getPanelAddr():
from flask import request
protocol = 'https://'
return protocol + request.headers.get('host')
重启面板
到堡塔APP插件处生成二维码绑定手机。
再把源码改回来
重启面板
问题解决。