之前一直用的腾讯云CDN加上它的token TypeD规则,现在想迁移使用自己的服务器,但不想重构客户端的代码。


这篇文章仅供我个人备忘录,因为这是一篇失败的文章,nginx的鉴权算法和腾讯云的鉴权算法不一样所以不能兼容

因此我尝试弄个文件服务兼容腾讯云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,token密钥为123456,我需要在2020年10月2日21点00分前访问,则timestamp为:1601643600
unix时间戳

腾讯云的timestamp是十进制(Unix 时间戳),不用十六进制(Unix 时间戳)

md5hash的算法是计算123456/test/pic.jpg1601643600的md5值。

不用带加号

上面的md5hash算得:2efbe1a09054f4621a29d2e943262e7b
md5hash

32位小写

则最后组成的链接为:https://ra3.cve.pub/test/pic.jpg?sign=2efbe1a09054f4621a29d2e943262e7b&t=1601643600
和腾讯云CDN上的计算器计算结果比较如下:
腾讯云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

最后修改:2020 年 10 月 09 日
如果觉得我的文章对你有用,请随意赞赏