之前一直用的腾讯云CDN加上它的token TypeD规则,现在想迁移使用自己的服务器,但不想重构客户端的代码。
因此我尝试弄个文件服务兼容腾讯云CDN的token typed规则。就用nginx搭一个纯文件分享服务器吧。
我使用APPNODE+自行编译的nginx(使用lnmp.org脚本编译)作为我的文件服务器。需要
--with-http_secure_link_module
模块
免得漏掉了必要的模块
appnode使用自编译的nginx
TOKEN规则解释
腾讯云对自己token规则解释比较垃圾,我是参考阿里云的文档才弄懂的。
腾讯云的官方文档内容说:
其实说的不是很清晰
假设我的域名是ra3.cve.pub
,访问文件在网站的根目录/test/pic.jpg
如果不使用token的话,使用https://ra3.cve.pub/test/pic.jpg
即可访问:
假设我对接了token,token密钥为123456,我需要在2020年10月2日21点00分前访问,则timestamp为:1601643600
md5hash的算法是计算123456/test/pic.jpg1601643600
的md5值。
上面的md5hash算得:
2efbe1a09054f4621a29d2e943262e7b
则最后组成的链接为:https://ra3.cve.pub/test/pic.jpg?sign=2efbe1a09054f4621a29d2e943262e7b&t=1601643600
和腾讯云CDN上的计算器计算结果比较如下:
逐字比较就可以发现token完全一样
appnode对接nginx
我是用appnode对接lnmp.org安装的nginx模块
在lnmp的文件夹中lnmp.conf
内找到:
Nginx_Modules_Options=''
输入模块名称如下所示:
Nginx_Modules_Options='--with-http_secure_link_module'
然后正常编译安装nginx即可,并且使用:
mkdir /usr/local/nginx/conf/conf.d
cp /etc/systemd/system/nginx.service /usr/lib/systemd/system/nginx.service
来解决报错问题。
查看nginx已安装的模块,看看有没有安装上去。
[root@Hostname lnmp1.7]# nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.1.1g 21 Apr 2020
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-openssl=/root/lnmp1.7/src/openssl-1.1.1g --with-openssl-opt='enable-weak-ssl-ciphers' --with-http_secure_link_module
存在:--with-http_secure_link_module
即可。
然后按照之前的教程里将appnode对接nginx即可。
conf配置
--with-http_secure_link_module
的算法和腾讯云CDN的算法不一样,仅供参考
创建虚拟主机,在虚拟主机的配置文件内增加如下内容:
location / {
set $t 123456;
secure_link $arg_sign,$arg_t;
secure_link_md5 "$t$uri$arg_t";
if ($secure_link = "") {
return 403;
}
if ($secure_link = "0") {
return 410;
}
}
资源不存在或哈希比对失败返回403,时间戳过期返回410.
其中
$arg_sign → ?sign=
$arg_t → &t=
123456 → 密钥
$uri → 文件相对路径
$arg_t → 十进制(Unix 时间戳)
上面的conf配置文件就是为了兼容腾讯云CDN TypeD鉴权的配置。
测试
我在自己的文件服务器内配置好了后,使用token访问能正常访问
参考:
Module ngx_http_secure_link_module
此处评论已关闭