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)
}
}
