
# 配置鉴权方式B防止资源被恶意盗用
CDN分发的内容默认为公开资源，URL鉴权功能主要用于保护用户站点资源，防止资源被用户恶意下载盗用。华为云CDN提供了4种URL鉴权配置。本章为您详细介绍鉴权方式B的实现方式。
![](https://support.huaweicloud.com/usermanual-cdn/public_sys-resources/caution_3.0-zh-cn.png)
- URL鉴权功能默认关闭。
- 客户端请求鉴权不通过被拦截时，消耗了节点资源，因此会产生少量流量/带宽费用，全站加速的域名还会产生请求数费用。
- 如果您的域名有特殊配置，暂不支持控制台自助配置URL鉴权。
- 业务类型为"全站加速"的域名暂不支持配置"鉴权方式B"。
 
#### 原理说明
用户访问加密URL构成：
```
http://DomainName/timestamp/sha256/FileName
```
```
http://DomainName/timestamp/md5hash/FileName
```
当鉴权通过时，实际回源的URL为：
```
http://DomainName/FileName
```
鉴权字段描述如下表所示：
表1字段说明 
| 字段         | 描述                                                                                                                                               |
|:---|:---|
| DomainName | CDN加速域名。                                                                                                                                         |
| timestamp  | 鉴权服务器生成鉴权URL的时间，即：鉴权开始时间，时间点取自鉴权服务器的"UTC+8"时间，格式为YYYYMMDDHHMM，如：201706301000。                                                                    |
| 有效时间       | 鉴权有效的时间长度，取值为0\~31536000s。 示例：如果设置有效时间为1800s，则当前时间小于或等于"timestamp+1800s"时，用户才可以访问CDN。当前时间大于"timestamp+1800s"时，判定为失效。 |
| md5hash    | 通过md5算法计算出来的验证串，数字0-9和小写英文字母a-z混合组成，固定长度32。                                                                                                      |
| sha256     | 通过sha256算法计算出来的验证串，数字0-9和小写英文字母a-z混合组成，固定长度64。                                                                                                   |
| Filename   | 实际回源访问的URL，鉴权时Filename需以/开头。不包含？后面的参数。                                                                                                           |
| PrivateKey | 用户设定的鉴权密钥，来生成加密URL。如huaweicloud12345。由6\~32位大/小写字母和数字构成。                                                                                         |
   
#### 校验方法
CDN服务器收到请求后，会按照如下步骤进行校验：
1. 是否携带鉴权参数。如果没有携带鉴权参数，认为请求非法，返回HTTP 403错误。
2. 时间校验：CDN服务器接收到客户端请求后，判断鉴权URL中的"timestamp参数 + 鉴权URL有效时长"是否大于当前时间。
   - 如果"timestamp参数 + 鉴权URL有效时长"小于当前时间，认为过期失效并返回HTTP 403错误。
   
   - 如果"timestamp参数 + 鉴权URL有效时长"大于或等于当前时间，则通过时间校验，继续执行步骤[3]。
    
3. 加密串校验：时间校验通过后，则以sstring方式构造出一个字符串（参考以下sstring构造方式）。然后使用md5（sha256）算法算出HashValue，并和用户请求中带来的md5hash（sha256）进行对比。结果一致则认为鉴权通过并返回文件，否则鉴权失败返回HTTP 403错误。HashValue计算方式如下：
   ```
   sstring = “PrivateKeytimestampFilename”
   HashValue = sha256sum(sstring)
   ```
   或：
   ```
   sstring = “PrivateKeytimestampFilename”
   HashValue = md5sum(sstring)
   ```
   
 
#### 操作步骤
1. 登录[CDN控制台](https://console.huaweicloud.com/cdn/?locale=zh-cn#/cdn/overview)。
2. 在左侧菜单栏中，选择"域名管理"。
3. 在域名列表中，单击需要修改的域名，进入"概览"页面。
4. 选择"访问控制"页签。
5. 在URL鉴权配置模块，打开开关，进入配置界面。
   图1配置URL鉴权   
   ![](https://support.huaweicloud.com/usermanual-cdn/zh-cn_image_0000002565801037.png "点击放大") 
6. 参照下表配置参数，单击"确定"，完成配置。
    表2参数说明 
   | 参数       | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   |:---|:---|
   | 鉴权方式     | 选择"方式B"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   | 鉴权范围     | 指定哪些文件参与鉴权，目前仅支持选择所有文件、指定文件后缀鉴权、指定文件后缀不鉴权。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
   | 鉴权继承配置   | 为M3U8索引文件下的TS文件添加鉴权参数，解决因鉴权不通过导致的TS文件无法播放的问题。 说明： - 如果嵌套多层M3U8文件，仅解析第一层M3U8文件，不展开嵌套M3U8文件的TS流。  - 支持标准M3U8格式（按行解析：解析不成功时返回原值，支持以标签#EXT-X-MAP开头的URI，支持以非#开头的URL/URI）。  - 如果M3U8索引文件中的#EXT-X-STREAM-INF等标签使用了相对路径"../"来引用子M3U8，则鉴权继承配置失效。  - 如果您的M3U8索引文件中含有中文或特殊字符，CDN在鉴权计算时不会自动转码。如果客户端访问时存在自动将中文或特殊字符转码逻辑，可能导致鉴权不通过，从而访问失败。  - 如果源站响应给CDN节点的是压缩（Gzip和Brotli）后的资源，则鉴权继承配置失效。   |
   | 鉴权继承开始时间 | - 与M3U8访问链一致：鉴权开始时间取M3U8访问的时间。  - 当前时间：鉴权开始时间取鉴权服务器的当前时间。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   | 文件后缀     | 当需要指定文件类型时填写此参数，指定特定后缀的文件参与或者不参与鉴权。 - 仅支持小写字符、数字，多个文件后缀用";"分隔。  - 最多可输入20个文件后缀，单个文件后缀不能超过255个字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | 鉴权KEY    | 鉴权密码，由6\~32位大/小写字母和数字构成。 说明： 为了增加安全性，建议设置8\~32位字母+数字组成的密码。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | 鉴权KEY（备） | 鉴权备用密码，可不用配置。当需要替换密钥时，如果需要新旧密钥同时生效，可设置备KEY。主、备KEY之一鉴权通过即可正常访问。 - 由6\~32位大/小写字母和数字构成。 说明： 为了增加安全性，建议设置8\~32位字母+数字组成的密码。                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   | 加密算法     | 用于信息加密的算法，可选MD5或SHA256。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | 有效时间长度   | 鉴权有效的时间长度，取值为0\~31536000s。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
      
   **鉴权计算器**
   鉴权计算器是为了方便您生成鉴权URL以供用户使用，根据[表2]和[表3]设置不同的参数后，单击"生成"即可生成鉴权URL和过期时间。
    表3参数说明 
   | 参数     | 说明                                                                                                                             |
   |:---|:---|
   | 鉴权KEY  | 鉴权密码，由6\~32位大/小写字母和数字构成，与鉴权配置中的密码一致。                                                                                           |
   | 访问路径   | 资源所在路径，以/开头，无需携带参数。                                                                                                            |
   | 加密算法   | 用于信息加密的算法，可选MD5或SHA256。                                                                                                        |
   | 开始时间   | 鉴权URL的生效起始时间。                                                                                                                  |
   | 有效时间长度 | 鉴权URL的有效时间，取值为0\~31536000s。最大值为鉴权配置中设置的有效时间。 示例：鉴权配置中设置的有效时间长度为1800秒，鉴权计算器中设置2000秒，那么有效时间依然是1800秒。 |
      
   ![](https://support.huaweicloud.com/usermanual-cdn/public_sys-resources/note_3.0-zh-cn.png)
   如果您的鉴权URL中含有中文或特殊字符，请先进行URL转码（即Encode）后使用。
   
 
#### 关闭URL鉴权
关闭"状态"开关即可关闭URL鉴权配置，此时所有配置将被清空，下次启用URL鉴权功能时需要重新配置相关参数。
#### 示例说明
**以使用MD5算法为例：**
1. 回源请求对象：
   ```
   http://hwcdn.example.com/T128_2_1_0_sdk/0210/M00/82/3E/test.mp3
   ```
   
2. 密钥设为：huaweicloud12345（用户自行设置）
3. 用户访问客户源服务器时间为：201706301000（格式为：YYYYMMDDHHMM）
4. CDN服务器构造一个用于计算md5hash的签名字符串：
   ```
   huaweicloud12345201706301000/T128_2_1_0_sdk/0210/M00/82/3E/test.mp3
   ```
   
5. CDN服务器根据该签名字符串计算md5hash：
   ```
   md5hash = md5sum("huaweicloud12345201706301000/T128_2_1_0_sdk/0210/M00/82/3E/test.mp3") =668f28d134ec6446a8ae83a43d0a554b
   ```
   
6. 请求CDN时URL：
   ```
   http://hwcdn.example.com/201706301000/668f28d134ec6446a8ae83a43d0a554b/T128_2_1_0_sdk/0210/M00/82/3E/test.mp3
   ```
   
如果请求在有效时间内(请求时间小于等于2017年6月30日10：30：00)，并且计算出来的md5hash与用户请求中带的md5hash值（668f28d134ec6446a8ae83a43d0a554b）一致，则鉴权通过。
#### 相关文档
调用接口修改URL鉴权请参考：[修改域名全量配置接口 - UpdateDomainFullConfig](https://support.huaweicloud.com/api-cdn/UpdateDomainFullConfig.html)。
