阿里云视频直播服务获取签名,试了一万次,最后还是催工单了,好尴尬

直接上代码

package com.zjy.xzlive.util;import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Encoder;import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;public class ALiYunSignUtils {public static String Format = "xml";                                        //返回值的类型,支持JSON与XMLpublic static String Version = "2016-11-01";                                //API版本号public static String Signature = "";                                        //签名结果字符串public static String SignatureMethod = "HMAC-SHA1";                         //签名方式public static String SignatureNonce = new RandomGUID().toString();         //唯一随机数,用于防止网络重复攻击public static String SignatureVersion = "1.0";                              //签名算法版本public static String AccessKeyId = "";                      //填写自己的keypublic static String AccessKeySecret = "";    //填写自己的secretpublic static String Timestamp = getTimestamp();                            //请求的时间戳private static final String ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";public static String getTimestamp() {//1、取得本地时间:final java.util.Calendar cal = java.util.Calendar.getInstance();//System.out.println(cal.getTime());//2、取得时间偏移量:final int zoneOffset = cal.get(java.util.Calendar.ZONE_OFFSET);//System.out.println(zoneOffset);//3、取得夏令时差:final int dstOffset = cal.get(java.util.Calendar.DST_OFFSET);//System.out.println(dstOffset);//4、从本地时间里扣除这些差量,即可以取得UTC时间:cal.add(java.util.Calendar.MILLISECOND, -(zoneOffset + dstOffset));SimpleDateFormat df = new SimpleDateFormat(ISO8601_DATE_FORMAT);return df.format(cal.getTime());}public static String getSignature(String Action, String DomainName) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {Map map = new HashMap();map.put("Format", Format);map.put("Version", Version);map.put("SignatureMethod", SignatureMethod);map.put("SignatureNonce", SignatureNonce);map.put("SignatureVersion", SignatureVersion);map.put("AccessKeyId", AccessKeyId);map.put("Timestamp", Timestamp);map.put("Action", Action);map.put("DomainName", DomainName);//1 构造规范化的请求字符串CQString//1.1参数排序String[] sortedKeys = (String[]) map.keySet().toArray(new String[]{});Arrays.sort(sortedKeys);//1.2参数编码StringBuilder CQString = new StringBuilder();for (String key : sortedKeys) {// 这里注意对key和value进行编码CQString.append("&").append(percentEncode(key)).append("=").append(percentEncode((String) map.get(key)));}//2 将上述的CQString构造成待签名的字符串String StringToSign = "GET" + "&" +percentEncode("/") + "&" +percentEncode(CQString.toString().substring(1));//3 计算待签名字符串StringToSign的HMAC值String key = AccessKeySecret + "&";SecretKey secretKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");//System.out.println(key.getBytes());Mac mac = null;try {mac = Mac.getInstance("HmacSHA1");} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {mac.init(secretKey);} catch (InvalidKeyException e) {// TODO Auto-generated catch blocke.printStackTrace();}byte[] HMAC=mac.doFinal(StringToSign.getBytes());//4 按照 Base64 编码规则把上面的 HMAC 值编码成字符串,即得到签名值(Signature)String Signature= Base64.encodeBase64String(HMAC);return Signature;}private static final String ENCODING = "UTF-8";private static String percentEncode(String value) throws UnsupportedEncodingException {return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null;}private static String getSignature(String action, String domainName, String appName, String streamName, String endTime, String startTime) throws UnsupportedEncodingException {Map map = new HashMap();map.put("Format", Format);map.put("Version", Version);map.put("SignatureMethod", SignatureMethod);map.put("SignatureNonce", SignatureNonce);map.put("SignatureVersion", SignatureVersion);map.put("AccessKeyId", AccessKeyId);map.put("Timestamp", Timestamp);map.put("Action", action);map.put("DomainName", domainName);map.put("AppName",appName);map.put("EndTime",endTime);map.put("StartTime",startTime);map.put("StreamName",streamName);//1 构造规范化的请求字符串CQString//1.1参数排序String[] sortedKeys = (String[]) map.keySet().toArray(new String[]{});Arrays.sort(sortedKeys);//1.2参数编码StringBuilder CQString = new StringBuilder();for (String key : sortedKeys) {// 这里注意对key和value进行编码CQString.append("&").append(percentEncode(key)).append("=").append(percentEncode((String) map.get(key)));}//2 将上述的CQString构造成待签名的字符串String StringToSign = "GET" + "&" +percentEncode("/") + "&" +percentEncode(CQString.toString().substring(1));//3 计算待签名字符串StringToSign的HMAC值String key = AccessKeySecret + "&";SecretKey secretKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");//System.out.println(key.getBytes());Mac mac = null;try {mac = Mac.getInstance("HmacSHA1");} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {mac.init(secretKey);} catch (InvalidKeyException e) {// TODO Auto-generated catch blocke.printStackTrace();}byte[] HMAC=mac.doFinal(StringToSign.getBytes());//4 按照 Base64 编码规则把上面的 HMAC 值编码成字符串,即得到签名值(Signature)String Signature= Base64.encodeBase64String(HMAC); //.getEncoder().encodeToString(HMAC);//String Signature = new sun.misc.BASE64Encoder().encode(HMAC);return Signature;}public static void main(String[] args) throws InvalidKeyException, UnsupportedEncodingException, NoSuchAlgorithmException {// TODO Auto-generated method stubString Action = "SetLiveStreamsNotifyUrlConfig";//String Action = "AddLiveRecordNotifyConfig";String DomainName = "zb.0898zlb.com";String NotifyUrl = "http://crown.free.idcfengye.com/System/LiveSet/zbCallBack";boolean NeedStatusNotify = true;//String AppName = "xzlive";//String StreamName = "xz_1234";//String EndTime = "2018-09-28T16:36:00Z";//String StartTime = "2018-09-26T16:36:00Z";System.out.println(getSignature222(Action, DomainName,NotifyUrl,NeedStatusNotify));String url = "http://live.aliyuncs.com/?"+ "Format=" + Format+ "&SignatureMethod=" + SignatureMethod+ "&Signature=" + getSignature222(Action, DomainName,NotifyUrl,NeedStatusNotify)+ "&Timestamp=" + Timestamp+ "&Action=" + Action+ "&DomainName=" + DomainName//+ "&NeedStatusNotify="+NeedStatusNotify//+ "&AppName=" + AppName//+ "&StreamName=" + StreamName//+ "&EndTime="+"2018-09-28T16:36:00Z"//+ "&StartTime="+"2018-09-26T16:36:00Z"+ "&AccessKeyId=" + AccessKeyId+ "&SignatureNonce=" + SignatureNonce+ "&Version=" + Version+ "&SignatureVersion=" +SignatureVersion+ "&NotifyUrl="+"http://crown.free.idcfengye.com/System/LiveSet/zbCallBack";System.out.println(url);//添加录制回调}private static String getSignature222(String action, String domainName, String NotifyUrl,boolean NeedStatusNotify) throws UnsupportedEncodingException {Map map = new HashMap();map.put("Format", Format);map.put("Version", Version);map.put("SignatureMethod", SignatureMethod);map.put("SignatureNonce", SignatureNonce);map.put("SignatureVersion", SignatureVersion);map.put("AccessKeyId", AccessKeyId);map.put("Timestamp", Timestamp);map.put("Action", action);map.put("DomainName", domainName);map.put("NotifyUrl",NotifyUrl);//map.put("NeedStatusNotify",NeedStatusNotify);//1 构造规范化的请求字符串CQString//1.1参数排序String[] sortedKeys = (String[]) map.keySet().toArray(new String[]{});Arrays.sort(sortedKeys);//1.2参数编码StringBuilder CQString = new StringBuilder();for (String key : sortedKeys) {// 这里注意对key和value进行编码CQString.append("&").append(percentEncode(key)).append("=").append(percentEncode((String) map.get(key)));}//2 将上述的CQString构造成待签名的字符串String StringToSign = "GET" + "&" +percentEncode("/") + "&" +percentEncode(CQString.toString().substring(1));//3 计算待签名字符串StringToSign的HMAC值String key = AccessKeySecret + "&";SecretKey secretKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");//System.out.println(key.getBytes());Mac mac = null;try {mac = Mac.getInstance("HmacSHA1");} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {mac.init(secretKey);} catch (InvalidKeyException e) {// TODO Auto-generated catch blocke.printStackTrace();}byte[] HMAC=mac.doFinal(StringToSign.getBytes());//4 按照 Base64 编码规则把上面的 HMAC 值编码成字符串,即得到签名值(Signature)String Signature= Base64.encodeBase64String(HMAC); //.getEncoder().encodeToString(HMAC);//String Signature = new sun.misc.BASE64Encoder().encode(HMAC);return Signature;}
}

注意这一段Base64用的是jdk1.7的注意版本

阿里云视频直播服务获取签名相关推荐

  1. 首批唯一!阿里云视频直播服务获信通院首批唯一认证

    简介:阿里云视频直播服务 7 月 28 日,由中国信息通信研究院主办的 2021 可信云大会上,阿里云凭借在视频直播 "云 - 边 - 端" 的产品技术优势,以最高标准通过了可信云 ...

  2. 深度解读:阿里云视频直播功能升级

    2022年注定是体育超级大年,冬奥.亚运会.大运会.世界杯等各类大型体育赛事应接不暇.随之而来便是各类赛事直播,客户对直播服务要求变得越来越高,视频直播技术创新显得格外重要.如何利用直播技术创新降低线 ...

  3. H5直播之阿里云视频直播的实现

    转自https://blog.csdn.net/hanierming/article/details/52769424 由于公司需要开发一款直播软件,以前也并没有接触过直播这一方面,所以就来从0开始做 ...

  4. 阿里云视频直播推流和播流地址生成

    记录学习阿里云视频直播 准备环境: 1.已开通阿里云视频直播服务. 2.2个域名:一个用于推流,一个用于播流. 3.在视频直播服务里面找到域名配置,配置好播流和推流域名之间的关系. 4.下载Vlc和o ...

  5. 阿里云视频直播 签名机制

    其实很少写博客,都是放在个人云笔记里面的.但是这个坑,还是救救有些新手. 阿里云视频直播的API调用方式,其实和其他的阿里云服务签名大同小异! https://help.aliyun.com/docu ...

  6. 阿里云视频直播使用详细步骤

    目录 一.阿里云视频直播 1.什么是视频直播 2.视频直播架构 3.官方文档链接 二.使用流程 1.使用条件 2.添加推流域名和播流域名 3.配置CNAME 4.关联推流域名和播流域名 5.生成推流地 ...

  7. java SpringBoot 集成 阿里云视频直播 完成直播功能

    经历了几天的周折,近期才把项目完成,在这里与大家分享一下踩坑之路,也方便日后有类似项目,可以借阅一番 开发直播前先满足已下条件 1.开通视频直播功能 2.购买好了OSS存储 3.购买两个域名并且备案好 ...

  8. 阿里云视频直播PHP-SDK

    阿里云 视频直播 配置 及 PHP-SDK 接入教程 准备工作 域名管理 配置鉴权 地址生成器及DEMO演示-熟悉鉴权 接入SDK 推流回调的配置 阿里云 视频直播 配置 及 PHP-SDK 接入教程 ...

  9. 阿里云视频直播产品使用流程

    1 阿里云视频直播使用流程 1.1 域名配置,及CNAME映射 开通视频直播,开通服务免费,产生的流量付费: 1.1.1 开通后,进入管理控制台: 使用阿里云视频直播,必须有一个审核通过的域名.没有的 ...

最新文章

  1. 朴素贝叶斯分类器简介及C++实现(性别分类)
  2. 常见web攻击方式与防御方法
  3. 虚拟机开启mysql服务_远程操作虚拟机中的mysql服务器
  4. Linux的iovec、readv和writev
  5. 自创算法实现Reporting Service中多值判定
  6. c/c++常见关键字
  7. Pycharm新建文件时头部模板的配置方法
  8. 财子说丨王国斌:相信时间的力量
  9. linux中类似append的命令,Linux技巧:介绍 tar 命令打包、压缩、和加解密的用法
  10. JVM 垃圾回收机制和常见的垃圾回收器
  11. 使用Tin快速安装 Apache APISIX(全网最快)
  12. 华为服务器怎么设置u盘启动安装系统,服务器怎么设置u盘启动
  13. ubantu下安装redis
  14. Vue组件的抽离和封装
  15. unicloud进阶uni-id入门(一)---uni-id能做什么?
  16. 离散数学 数学三大危机
  17. vue 中provide的用法_vue中provide和inject的用法
  18. 【算法】传教士和野人问题
  19. 一 、Single Threaded Execution 模式
  20. Bootstrap系列之treeview实现菜单树

热门文章

  1. oracle数据库字符串添加空格,空字符串和空格字符串在informix和oralce 的差异
  2. leetcode LCP 30. 魔塔游戏
  3. vbs画动态爱心代码_用vb算法画出爱心
  4. 前端基础 csss3
  5. C语言程序设计学习笔记:P5-循环控制
  6. Ubuntu20.04突然无法打开蓝牙
  7. 关系数据库的查询优化
  8. Django Admin界面美化第三方插件库测评(多图)
  9. Android去除录音中的背景音,视频消音保留背景音乐 怎么能去掉视频中的人声 比如电影中一段人物对话有背景音乐...
  10. 下载网件公司(netgear)交换机路由器帮助文档方法