logo
实时音视频
当前页

CDN 推流鉴权

2024-01-15

推流鉴权简介

为防止攻击者盗取您的推流 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 小时后失效,那么:

  1. txTime 就可以设置为 2018-12-29 14:13:45。
  2. 再将该时间转换成 Unix 时间戳格式(即 1546064025)。
  3. 然后再转换成十六进制,以进一步压缩字符长度,得到 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 小时后失效,那么:

  1. wsABStime 就可以设置为 2018-12-29 14:13:45。
  2. 再将该时间转换成 Unix 时间戳格式(即 1546064025)。
  3. 然后再转换成十六进制,以进一步压缩字符长度,得到 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 小时后失效,那么:

  1. hwTime 就可以设置为 2018-12-29 14:13:45。
  2. 再将该时间转换成 Unix 时间戳格式(即 1546064025)。
  3. 然后再转换成十六进制,以进一步压缩字符长度,得到 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)
    }
}
2024-01-15

Previous

使用 CDN 直播

Next

通过 URL 拉流