CDN 推流鉴权
推流鉴权简介
为防止攻击者盗取您的推流 URL 地址在别处推流使用、或伪造您的服务器生成推流 URL 地址,从而造成流量损失,您可以通过 ZEGO 控制台 自助配置 推流鉴权,当开启鉴权后,需要在推流 URL 地址中拼接相关的鉴权参数,否则无法推流。
- 您从 ZEGO 控制台 配置 
推流鉴权后,请妥善保管 KEY,勿轻易泄露,以防被攻击者获取,造成损失。 - 若您是 RTC 转推 CDN、或混流转推 CDN,ZEGO 服务器会自动帮您生成、并拼接 URL 地址的参数,您无需再自行生成;若您是通过第三方平台推流,则需要自行生成和拼接相关参数。
 
使用时,请您根据自己的 AppID 主营业务地区,参考如下文档进行配置。
腾讯云鉴权说明
开启 推流鉴权 后,完整的推流地址如下:

其中,“domain” 和“接入点”,请在 “控制台 > 项目详情 > 服务配置 > CDN 服务 > CDN 相关地址” 获取。

1 生成鉴权密钥
请前往 ZEGO 控制台,在您的 “项目配置 > 服务配置” 中,找到 鉴权配置,开启,在弹出的对话框中配置或自动生成推流鉴权 KEY。
其中,主 KEY 为必填、备 KEY 为选填。我们建议您同时配置主 KEY 和备 KEY,如果主 KEY 泄露,可平滑切换到备 KEY,不影响您的业务使用。

2 生成 txTime
txTime,指该推流 URL 地址的有效期。
例如,当前的时间是 2018-12-29 11:13:45,期望新生成的 URL 是在 3 小时后失效,那么:
- txTime 就可以设置为 2018-12-29 14:13:45。
 - 再将该时间转换成 Unix 时间戳格式(即 1546064025)。
 - 然后再转换成十六进制,以进一步压缩字符长度,得到 txTime = 5c271099(十六进制)。
 
3 生成 txSecret
txSecret 的生成方法是 txSecret = MD5(KEY + StreamName + txTime)。
其中:
- KEY:指您在 生成鉴权密钥 中配置的加密 KEY。
 - StreamName:流名称,用户自定义,用于标识直播流。
 - txTime:指您在 生成 txTime 中生成的 txTime。
 - MD5:标准的 MD5 单向不可逆哈希算法。
 
4 得到 URL 地址
按照以上步骤完成后,最终地址如下(示例地址,该地址仅作为格式参考,请勿直接线上使用):
rtmp://push-tencent1.zego.im/live/123?txSecret=235cec79bf9483439762ddfd491387e2&txTime=5c271099网宿云鉴权说明
开启 推流鉴权 后,完整的推流地址如下:

其中,“domain” 和“接入点”,请在 “控制台 > 项目详情 > 服务配置 > CDN 服务 > CDN 相关地址” 获取。

1 生成鉴权密钥
请前往 ZEGO 控制台,在您的 “项目配置 > 服务配置” 中,找到 鉴权配置,开启,在弹出的对话框中配置或自动生成推流鉴权 KEY。
其中,主 KEY 为必填、备 KEY 为选填。我们建议您同时配置主 KEY 和备 KEY,如果主 KEY 泄露,可平滑切换到备 KEY,不影响您的业务使用。

2 生成 wsABStime
wsABStime,指该推流 URL 地址的有效期。
例如,当前的时间是 2018-12-29 11:13:45,期望新生成的 URL 是在 3 小时后失效,那么:
- wsABStime 就可以设置为 2018-12-29 14:13:45。
 - 再将该时间转换成 Unix 时间戳格式(即 1546064025)。
 - 然后再转换成十六进制,以进一步压缩字符长度,得到 wsABStime = 5C271099(十六进制)。
 
3 生成 wsSecret
wsSecret 的生成方法是 wsSecret = MD5(wsABStime + StreamName + KEY)。
其中:
- wsABStime:指您在 生成 wsABStime 中生成的 wsABStime,例如 5C271099。
 - StreamName:路径,格式为 “/接入点/streamID”,例如 /live/streamid123。
 - KEY:指您在 生成鉴权密钥 中配置的加密 KEY,例如 KEY123。
 - MD5:标准的 MD5 单向不可逆哈希算法。
 
即 wsSecret = MD5(5C271099/live/streamid123KEY123)
4 得到 URL 地址
按照以上步骤完成后,最终地址如下(示例地址,该地址仅作为格式参考,请勿直接线上使用):
rtmp://push-ws1.zego.im/live/123?wsSecret=235cec79bf9483439762ddfd491387e2&wsABStime=5C271099华为云鉴权说明
开启 推流鉴权 后,完整的推流地址如下:

其中,“domain” 和“接入点”,请在 “控制台 > 项目详情 > 服务配置 > CDN 服务 > CDN 相关地址” 获取。
1 获取鉴权密钥
请联系 ZEGO 技术支持,配置华为云 CDN 推流鉴权的相关权限,获取鉴权密钥。
2 生成 hwTime
hwTime,指该推流 URL 地址的有效时长。
例如,当前的时间是 2018-12-29 11:13:45,期望新生成的 URL 是在 3 小时后失效,那么:
- hwTime 就可以设置为 2018-12-29 14:13:45。
 - 再将该时间转换成 Unix 时间戳格式(即 1546064025)。
 - 然后再转换成十六进制,以进一步压缩字符长度,得到 hwTime = 5c271099(十六进制)。
 
3 生成 hwSecret
hwSecret 的生成方法是 hwSecret = hmac_sha256(KEY, StreamName + hwTime)。
其中:
- KEY:指您在 获取鉴权密钥 中获取的鉴权密钥。
 - StreamName:流名称,用户自定义,用于标识直播流。
 - hwTime:指您在 生成 hwTime 中生成的 hwTime。
 - hmac_sha256:HMAC-SHA256 加密算法。
 
4 得到 URL 地址
按照以上步骤完成后,最终地址如下(示例地址,该地址仅作为格式参考,请勿直接线上使用):
rtmp://push-huawei1.zego.im/live/123?hwSecret=ce201856a0957413319e883c8ccae13602f01d3d91e21daf5161964cf708a6a8&hwTime=5c271099鉴权参数生成示例代码
以下是支持三家厂商(腾讯云、网宿云、华为云)的统一鉴权参数生成示例代码:
package main
import (
    "crypto/hmac"
    "crypto/md5"
    "crypto/sha256"
    "fmt"
    "time"
)
// AuthResult 鉴权结果
type AuthResult struct {
    Secret string // 鉴权密钥
    Time   string // 时间参数
    URL    string // 完整推流URL
}
// GenerateCDNAuth 生成CDN鉴权参数
func GenerateCDNAuth(provider, key, streamName string, expireHours int) (*AuthResult, error) {
    // 1. 生成过期时间戳(十六进制)
    expireTime := time.Now().Add(time.Duration(expireHours) * time.Hour).Unix()
    timeHex := fmt.Sprintf("%x", expireTime)
    var secret, timeParam, url string
    switch provider {
    case "tencent":
        // 腾讯云: txSecret = MD5(KEY + StreamName + txTime)
        data := key + streamName + timeHex
        hash := md5.Sum([]byte(data))
        secret = fmt.Sprintf("%x", hash)
        timeParam = timeHex
        url = fmt.Sprintf("rtmp://push-tencent1.zego.im/live/%s?txSecret=%s&txTime=%s",
            streamName, secret, timeParam)
    case "wangsu":
        // 网宿云流名称需要包含接入点/live/前缀
        // 网宿云: wsSecret = MD5(wsABStime + StreamName + KEY)
        timeParam = strings.ToUpper(timeHex)
        data := timeParam + "/live/" + streamName + key
        hash := md5.Sum([]byte(data))
        secret = fmt.Sprintf("%x", hash)
        url = fmt.Sprintf("rtmp://push-ws1.zego.im/live/%s?wsSecret=%s&wsABStime=%s",
            streamName, secret, timeParam)
    case "huawei":
        // 华为云: hwSecret = hmac_sha256(KEY, StreamName + hwTime)
        data := streamName + timeHex
        h := hmac.New(sha256.New, []byte(key))
        h.Write([]byte(data))
        secret = fmt.Sprintf("%x", h.Sum(nil))
        timeParam = timeHex
        url = fmt.Sprintf("rtmp://push-huawei1.zego.im/live/%s?hwSecret=%s&hwTime=%s",
            streamName, secret, timeParam)
    default:
        return nil, fmt.Errorf("不支持的厂商: %s", provider)
    }
    return &AuthResult{
        Secret: secret,
        Time:   timeParam,
        URL:    url,
    }, nil
}
func main() {
    // 示例参数
    key := "your_auth_key"           // 鉴权密钥
    streamName := "123"              // 流名称
    expireHours := 3                 // 3小时后过期
    // 生成腾讯云鉴权
    if result, err := GenerateCDNAuth("tencent", key, streamName, expireHours); err == nil {
        fmt.Printf("腾讯云 - Secret: %s, Time: %s\n", result.Secret, result.Time)
        fmt.Printf("腾讯云 - URL: %s\n\n", result.URL)
    }
    // 生成网宿云鉴权
    if result, err := GenerateCDNAuth("wangsu", key, streamName, expireHours); err == nil {
        fmt.Printf("网宿云 - Secret: %s, Time: %s\n", result.Secret, result.Time)
        fmt.Printf("网宿云 - URL: %s\n\n", result.URL)
    }
    // 生成华为云鉴权
    if result, err := GenerateCDNAuth("huawei", key, streamName, expireHours); err == nil {
        fmt.Printf("华为云 - Secret: %s, Time: %s\n", result.Secret, result.Time)
        fmt.Printf("华为云 - URL: %s\n", result.URL)
    }
}
