腾讯云CDN高级鉴权的配置

为防止客户源站内容被盗用,腾讯云CDN提供防盗链功能,客户可通过配置Referer和IP的黑白名单来保护源站资源。然而由于Referer内容可被伪造,实际使用中仍存在盗链的隐患。为了更好地保护源站资源,腾讯云CDN支持加密源站URL的功能,通过鉴权的方式来正确响应合法请求、拒绝非法请求。

原理概述

URL高级鉴权是腾讯云腾讯云CDN加速节点和客户源站配合实现的一种更加安全可靠的源站资源防盗方法。

  1. 腾讯云CDN客户提供加密URL给客户端
  2. 客户端使用加密URL对腾讯云CDN节点发起请求
  3. 腾讯云CDN加速节点验证加密URL的权限信息以判断请求的合法性。请求合法时正常响应,请求不合法时拒绝请求,以保护源站资源。

URL鉴权方式

腾讯云腾讯云CDN支持A类、B类、C类三种鉴权方式,用户可以根据业务需要选择不同的鉴权方式对URL进行加密,实现对源站资源的保护。

A类鉴权方式

原理说明

原始URL: http://Domain/Filename

加密URL: http://Domain/Filename?auth_key=Timestamp-Rand-Uid-Md5hash

加密URL字段解释

字段描述Domain腾讯云CDN客户站点的域名Filename实际回源访问的URL,鉴权时Filename需以/开头Timestamp加密URL失效时间,整形正数,值为1970年1月1日至失效时间之间秒数。可为10进制或16进制,需与控制台配置一致。Rand随机数,不能包含中划线-。UiduserId,不能包含中划线-。Md5hash通过md5算法计算出来的验证串,数字0-9和小写英文字母a-z混合组成,固定长度32。值为md5sum(sstring),其中sstring="Filename-Timestamp-Rand-Uid-Key",Key可以为主KEY或者备KEY

腾讯云CDN服务器接收到请求后,会执行如下校验。

1.解析请求中Timestamp,如果Timestamp小于当前时间,则认为加密URL过期,响应HTTP 403错误。

  1. 以sstring方式构造出一个字符串。然后使用md5算法算出HashValue,并与客户端请求中带来的Md5hash进行对比。如果一致则认为鉴权通过并返回文件,否则鉴权失败返回HTTP 403错误。

示例说明

  1. 原始URL:http://opencdn.example.com/authentication/test/2F.html。
  2. 设置密钥:bdcloud666(由用户自行设置)。
  3. 客户设置加密URL失效日期为:2017年6月30日00:00:00,即计算出来的秒数为1498752000;rand设置为"0",uid设置为"0"。
  4. 客户拼接出sstring:"/authentication/test/2F.html-1498752000-0-0-bdcloud666"
  5. 根据sstring字符串计算md5hash = md5sum("/authentication/test/2F.html-1498752000-0-0-bdcloud666") = 89518343a306f93173783a260bb364f0
  6. 生成加密URL为:http://opencdn.example.com/authentication/test/2F.html?auth_key=1498752000-0-0-89518343a306f93173783a260bb364f0。
  7. 客户端使用加密URL访问腾讯云CDN节点,腾讯云CDN节点对Timestamp和Md5hash进行校验,校验通过则返回文件,否则鉴权失败返回HTTP 403错误。

API配置示例

"anti_hot_link":{"antiType": "typeA", "secretKey": "bdcloud666", "newsecretKey": "opencdn666","secureFile": "/test.txt"}
B类鉴权方式

原理说明

原始URL: http://Domain/Filename

加密URL: http://Domain/Timestamp/Md5hash/FileName

加密URL字段解释

字段描述Domain腾讯云CDN客户站点的域名Timestamp时间戳,格式可以为10进制、16进制或格式为YYYYMMDDHHMM,其中格式是10进制和16进制表示的是1970年1月1日至时间戳之间秒数,格式需与控制台配置一致。时间戳 + 有效时间(控制台配置)即为加密URL过期时间。例如有效时间配置成1800s,时间戳设置成201706301000,那么加密URL在2017-06-30 10:30:00之后失效。Md5hash通过md5算法计算出来的验证串,数字0-9和小写英文字母a-z混合组成,固定长度32。值为md5sum(sstring),其中sstring="KeyTimestampFilename",Key可以为主KEY或者备KEYFilename实际回源访问的URL,鉴权时Filename需以/开头。

腾讯云CDN服务器接收到请求后,会执行如下校验。

  1. 解析请求中Timestamp,如果(Timestamp + 有效时间)小于当前时间,则认为加密URL过期,响应HTTP 403错误。
  2. 构造sstring(sstring="KeyTimestampFilename",Key可以为主KEY或者备KEY),然后使用md5算法算出HashValue,并与客户端请求中带来的Md5hash进行对比。如果一致则认为鉴权通过并返回文件,否则鉴权失败返回HTTP 403错误。

示例说明

  1. 原始URL:http://opencdn.example.com/4/44/obhqonkjtlhquiy93.mp3。
  2. 设置密钥:bdcloud666(由用户自行设置)。
  3. 设置有效时间:1800s(由用户自行设置)
  4. 设置timestamp为201706301000(格式为YYYYMMDDHHMM),即:2017年6月30日10:00:00
  5. 客户拼接出sstring:"bdcloud666201706301000/4/44/obhqonkjtlhquiy93.mp3"
  6. 根据sstring字符串计算md5hash = md5sum("bdcloud666201706301000/4/44/obhqonkjtlhquiy93.mp3") = c13e51c58f41084ac98bd9feeeb1a346
  7. 生成加密URL为:http://opencdn.example.com/201706301000/c13e51c58f41084ac98bd9feeeb1a346/4/44/ obhqonkjtlhquiy93.mp3。
  8. 客户端使用加密URL访问腾讯云CDN节点,腾讯云CDN节点对Timestamp和Md5hash进行校验,校验通过则返回文件,否则鉴权失败返回HTTP 403错误。

API配置示例

"anti_hot_link":{"antiType": "typeB", "secretKey": "bdcloud666", "newsecretKey": "opencdn666","secureFile": "/test.txt", "timeout": 1800}
C类鉴权方式

原理说明

原始URL: http://Domain/Filename

加密URL格式一: http://Domain/Md5hash/Timestamp/FileName

加密URL格式二: http://Domain/FileName?md5hash=Md5hash&timestamp=Timestamp

加密URL字段解释

字段描述Domain腾讯云CDN客户站点的域名Md5hash通过md5算法计算出来的验证串,数字0-9和小写英文字母a-z混合组成,固定长度32。值为md5sum(sstring),其中sstring="KeyFilenameTimestamp",Key可以为主KEY或者备KEYTimestamp时间戳,格式可以为10进制、16进制,表示的是1970年1月1日至时间戳之间秒数。格式需与控制台配置一致。时间戳 + 有效时间(控制台配置)即为加密URL过期时间。例如有效时间配置成1800s,时间戳设置成201706301000,那么加密URL在2017-06-30 10:30:00之后失效。Filename实际回源访问的URL,鉴权时Filename需以/开头。

腾讯云CDN服务器接收到请求后,会执行如下校验。

  1. 解析请求中Timestamp,如果(Timestamp + 有效时间)小于当前时间,则认为加密URL过期,响应HTTP 403错误。
  2. 构造sstring(sstring="KeyFilenameTimestamp",Key可以为主KEY或者备KEY),然后使用md5算法算出HashValue,并与客户端请求中带来的Md5hash进行对比。如果一致则认为鉴权通过并返回文件,否则鉴权失败返回HTTP 403错误。

示例说明

  1. 原始URL:http://opencdn.example.com/test.flv。
  2. 设置密钥:bdcloud666(由用户自行设置)。
  3. 设置有效时间:1800s(由用户自行设置)
  4. 客户设置timestamp为5955b0a0(格式为16进制),即:2017年6月30日10:00:00
  5. 客户拼接出sstring:"bdcloud666/test.flv5955b0a0"
  6. 根据sstring字符串计算md5hash = md5sum("bdcloud666/test.flv5955b0a0") = 34f55132617957ab98d86c4342a1f394。
  7. 生成加密URL为:

    • 格式一: http://opencdn.example.com/34f55132617957ab98d86c4342a1f394/5955b0a0/test.flv。
    • 格式二: http://opencdn.example.com/test.flv?md5hash=34f55132617957ab98d86c4342a1f394&timestamp=5955b0a0。
  8. 客户端使用任一格式加密URL访问腾讯云CDN节点,腾讯云CDN节点对Timestamp和Md5hash进行校验,校验通过则返回文件,否则鉴权失败返回HTTP 403错误。

配置URL鉴权

在“腾讯云CDN域名管理”页面点击“高级鉴权”进入高级鉴权设置页。

说明:

  • 高级防盗链功能开启后,可根据用户设置的鉴权Key对URL进行加密,保护客户源站资源。
  • 鉴权类型有三种,分别为A类鉴权、B类鉴权和C类鉴权,请根据需要选择。
  • 鉴权KEY包含主KEY和备KEY,主KEY必须设置,通过此KEY生成加密URL来限制用户访问。当需要替换密钥时,若需要新旧密钥同时生效,可设置备KEY。主、备KEY之一鉴权通过即可正常访问。KEY的格式为大小写字母、数字,长度6到32。备KEY不强制填写,格式与主KEY相同。
  • 有效时间:用户设置的加密URL的有效时间,用以生成鉴权URL,以s(秒)为单位,时间范围0~100000000整数。
  • 鉴权计算器可以根据选择的类型以及输入的参数生成鉴权URL,用户可以通过鉴权计算器知晓配置结果并验证是否生效。

腾讯云CDN 三种高级鉴权 PHP 代码

腾讯云CDN提供了以下三种高级鉴权的 PHP Demo。

腾讯云CDN在鉴权错误时,会给客户端返回403响应码,并在响应头里提示鉴权错误的类型,如:X-Error-Info: typeA

A类鉴权方式

function demoA(){$time = strtotime("+3 hours");$key = "key1234";$domain = "http://test.cdn.bce.com";$filename = "/dir/index.html";//$sstring = "$filename-$time-$rand-$uid-$key"$sstring = $filename."-".$time."-0-0-".$key;$md5 = md5($sstring);$auth_key = "auth_key=".$time."-0-0-".$md5;$url = $domain.$filename."?".$auth_key;// echo "md5_src_string: ".$sstring." ";echo "request_url: ".$url." ";}

B类鉴权方式

function demoB(){$dt = new DateTime("now", new DateTimeZone('Asia/Chongqing'));$time = $dt->format("YmdHi");$key = "key1234";$domain = "http://test.cdn.bce.com";$filename = "/dir/index.html";//$sstring = "$key$time$filename"$sstring = $key.$time.$filename;$md5 = md5($sstring);$url = $domain."/".$time."/".$md5.$filename;// echo "md5_src_string: ".$sstring." ";echo "request_url: ".$url." ";}

C类鉴权方式

function demoC(){$time = dechex(time());$key = "key1234";$domain = "http://test.cdn.bce.com";$filename = "/dir/index.html";//$sstring = "$key$filename$time"$sstring = $key.$filename.$time;$md5 = md5($sstring);$url1 = $domain."/".$md5."/".$time.$filename;$url2 = $domain.$filename."?md5hash=".$md5."&timestamp=".$time;// echo "md5_src_string: ".$sstring." ";echo "request_url type1: ".$url1." ";echo "request_url type2: ".$url2." ";}

标签