之前一直用的腾讯云CDN加上它的token TypeD规则,现在想迁移使用自己的服务器,但不想重构客户端的代码。
因此我尝试弄个文件服务兼容腾讯云CDN的token typed规则。就用nginx搭一个纯文件分享服务器吧。
我使用APPNODE+自行编译的nginx(使用lnmp.org脚本编译)作为我的文件服务器。需要
--with-http_secure_link_module
模块TOKEN规则解释
腾讯云对自己token规则解释比较垃圾,我是参考阿里云的文档才弄懂的。
腾讯云的官方文档内容说:
访问 URL 格式 http://DomainName/FileName?sign=md5hash&t=timestamp
算法说明
timestamp:十进制 / 十六进制(UNIX 时间戳)可选。 md5hash:MD5(自定义密钥 + 文件路径 +
timestamp)。 请求示例
http://cloud.tenloud.tencent.com/test.jpg?sign=0f8201d814dfaf64cf54e74c5f7dbcb0&t=1582791032注意: 计算 MD5 时,若请求路径为http://cloud.tencent.com/test.jpg,则计算 MD5
时路径为/test.jpg。
其实说的不是很清晰
假设我的域名是ra3.cve.pub
,访问文件在网站的根目录/test/pic.jpg
如果不使用token的话,使用https://ra3.cve.pub/test/pic.jpg
即可访问:
假设我对接了token,token密钥为123456,我需要在2020年10月2日21点00分前访问,则timestamp为:1601643600
腾讯云的timestamp是十进制(Unix 时间戳),不用十六进制(Unix 时间戳)
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
版权属于:寒夜方舟
本文链接:https://www.wnark.com/archives/135.html
本站所有原创文章采用署名-非商业性使用 4.0 国际 (CC BY-NC 4.0)。 您可以自由地转载和修改,但请注明引用文章来源和不可用于商业目的。声明:本博客完全禁止任何商业类网站转载,包括但不限于CSDN,51CTO,百度文库,360DOC,AcFun,哔哩哔哩等网站。
2 条评论
封图是星座?
是哒