
# 配置鉴权方式C2防止资源被恶意盗用
CDN分发的内容默认为公开资源，URL鉴权功能主要用于保护用户站点资源，防止资源被用户恶意下载盗用。华为云CDN提供了4种URL鉴权配置。本章为您详细介绍鉴权方式C2的实现方式。
![](https://support.huaweicloud.com/usermanual-cdn/public_sys-resources/caution_3.0-zh-cn.png)
- URL鉴权功能默认关闭。
- 如果您的域名有特殊配置，暂不支持控制台自助配置URL鉴权。
- 客户端请求鉴权不通过被拦截时，消耗了节点资源，因此会产生少量流量/带宽费用，全站加速的域名还会产生请求数费用。
- 配置鉴权后，用户将携带鉴权参数访问。如果您没有配置"忽略URL参数"：
  - 会增大回源概率。
  
  - 如果您的源站为对象存储桶，将会产生桶的流量流出费用。
   
 
 #### 原理说明
C2类鉴权方式的用户访问加密URL格式：
```
http://DomainName/FileName?auth_key=<sha256>&timestamp=<timestamp>
```
```
http://DomainName/FileName?auth_key=<md5hash>&timestamp=<timestamp>
```
鉴权字段描述如下表所示：
表1字段说明 
| 字段         | 描述                                                                                                                                                  |
|:---|:---|
| DomainName | CDN加速域名                                                                                                                                             |
| timestamp  | 鉴权服务器生成鉴权URL的时间，即：鉴权开始时间，值为1970年1月1日以来的当前时间秒数 。十进制或者十六进制整数。                                                                                         |
| 有效时间       | 鉴权有效的时间长度，取值为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位大/小写字母和数字构成。                                                                                            |
| 鉴权参数名      | 用户url中携带的鉴权信息参数名，默认为auth_key。                                                                                                                       |
| 时间参数名      | 用户url中携带的时间戳参数名称，默认为timestamp。                                                                                                                      |
   
#### 校验方法
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 = "PrivateKeyFilenameTimestamp" 
   HashValue = md5sum(sstring)
   ```
   或：
   ```
   sstring = "PrivateKeyFilenameTimestamp" 
   HashValue = sha256sum(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参数说明 
   | 参数       | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   |:---|:---|
   | 鉴权方式     | 选择"方式C2"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | 鉴权范围     | 指定哪些文件参与鉴权，目前仅支持选择所有文件、指定文件后缀鉴权、指定文件后缀不鉴权。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
   | 鉴权继承配置   | 为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位字母+数字组成的密码。                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   | 鉴权参数     | 用户url中携带的鉴权信息参数名，默认为auth_key。 - 最大长度为100个字符。  - 以字母开头，可以包含大小写字母、数字、"_"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
   | 时间参数名    | 鉴权时间参数，默认为"timestamp"。该参数会影响鉴权URL的构成，鉴权URL构成详见[原理说明]。 - 以字母开头，支持大小写字母、数字、"_"，字符长度不超过100。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   | 时间格式     | 鉴权URL中时间的格式。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   | 加密算法     | 用于信息加密的算法，可选MD5或SHA256。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | 有效时间长度   | 鉴权URL的有效时间，取值为0\~31536000s。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
      
   **鉴权计算器**
   鉴权计算器是为了方便您生成鉴权URL以供用户使用，根据[表2]和[表3]设置不同的参数后，单击"生成"即可生成鉴权URL和过期时间。
   ![](https://support.huaweicloud.com/usermanual-cdn/public_sys-resources/note_3.0-zh-cn.png)
   如果您的鉴权URL中含有中文或特殊字符，请先进行URL转码（即Encode）后使用。
    表3参数说明 
   | 参数     | 说明                                                                                                                             |
   |:---|:---|
   | 鉴权KEY  | 鉴权密码，由6\~32位大/小写字母和数字构成，与鉴权配置中的密码一致。                                                                                           |
   | 访问路径   | 资源所在路径，以/开头，无需携带参数。                                                                                                            |
   | 加密算法   | 用于信息加密的算法，可选MD5或SHA256。                                                                                                        |
   | 开始时间   | 鉴权URL的生效起始时间。                                                                                                                  |
   | 时间格式   | 鉴权URL的时间格式，与鉴权配置中保持一致。                                                                                                         |
   | 有效时间长度 | 鉴权URL的有效时间，取值为0\~31536000s。最大值为鉴权配置中设置的有效时间。 示例：鉴权配置中设置的有效时间长度为1800秒，鉴权计算器中设置2000秒，那么有效时间依然是1800秒。 |
      
   
 
#### 关闭URL鉴权
关闭"状态"开关即可关闭URL鉴权配置，此时所有配置将被清空，下次启用URL鉴权功能时需要重新配置相关参数。
#### 示例说明
**以使用MD5算法为例：**
1. 回源请求对象：
   ```
   http://hwcdn.example.com/T128_2_1_0_sdk/0210/M00/82/3E/test.mp3
   ```
   
2. 密钥设为：huaweicloud12345（用户自行设置）
3. 鉴权生效开始日期为：2017年6月30日10：00：00，计算出来的秒数为1498788000，并转换为十六进制为5955b0a0。并且设置有效时间为1800秒。
4. CDN服务器构造一个用于计算md5hash的签名字符串：
   ```
   huaweicloud12345/T128_2_1_0_sdk/0210/M00/82/3E/test.mp35955b0a0
   ```
   
5. CDN服务器根据该签名字符串计算md5hash：
   ```
   md5hash = md5sum(huaweicloud12345/T128_2_1_0_sdk/0210/M00/82/3E/test.mp35955b0a0) = 8540f43a2416fd4a432fe4f92d2ea089
   ```
   
6. 请求CDN时URL：
   ```
   http://hwcdn.example.com/T128_2_1_0_sdk/0210/M00/82/3E/test.mp3?auth_key=8540f43a2416fd4a432fe4f92d2ea089&timestamp=5955b0a0
   ```
   
如果请求在有效时间内(请求时间小于等于2017年6月30日10：30：00)，并且计算出来的md5hash与用户请求中带的md5hash值（8540f43a2416fd4a432fe4f92d2ea089）一致，则鉴权通过。
#### 相关文档
调用接口修改URL鉴权请参考：[修改域名全量配置接口 - UpdateDomainFullConfig](https://support.huaweicloud.com/api-cdn/UpdateDomainFullConfig.html)。
