腾讯云对象存储 非法签名?

  • 回答 (2)
  • 关注 (0)
  • 查看 (299)

使用腾讯云对象存储遇到ERROR_PROXY_AUTH_FAILED 非法签名 错误码-97 解决不了,求大神指点

用户1902412用户1902412提问于
chenasxz晚睡癌。回答于
推荐

应该是你的签名不对,COS分为v4与v5两个版本,两个版本的签名算法是不一样的。

以v4版本为例,签名需要用到的包括APPID、Bucket、SecretId、SecretKey等,步骤如下:

第一步:拼接字符串

对于多次有效签名

Original="a=[appid]&b=[bucket]&k=[SecretID]&e=[expiredTime]&t=[currentTime]&r=[rand]&f="

对于单次有效签名

Original = "a=[appid]&b=[bucket]&k=[SecretID]&e=[expiredTime]&t=[currentTime]&r=[rand]&f=[fileid]"

对于上面的各个字段中,a表示你的APPID,b表示对应bucket,k表示你的SecretID,t是当前的时间戳,单位为秒,e表示签名的失效时刻,也是时间戳,单次签名是e为0,r为无符号10进制整数,最长10位,f的格式为/APPID/bucketname/dirname/filename,还要对非"/"字符进行urlencode编码。当操作对象为 文件夹时,filename 缺省。filename 中要包含文件后缀名。

第二步:将刚刚拼接的字符串转换为签名

Sign=base64(append(HMAC-SHA1(SecretKey,Original),Original))

最后得到的签名应该是一段base64编码的值。

注意:使用PHP这类语言的hash_hmac函数时,第四个参数应置为true。

举例:我曾经使用的一个生成签名的函数(PHP)如下,供参考。

function CreateCosSign($bucket,$expired,$filename)
{
	$current=time();
	$rand=rand();
	$fileid="/".MY_APPID."/".$bucket.$filename;
	$fileid=str_replace("%2F","/",urlencode($fileid));
	$original="a=".MY_APPID."&b=".$bucket."&k=".MY_SECRETID."&e=".($current+$expired)."&t=".$current."&r=".$rand."&f=".$fileid;
	return base64_encode(hash_hmac("sha1",$original,MY_SECRETKEY,true).$original);
}
一夜之后的沉默闲来无事回答于

按照文档提示检查签名的类型(场景)、参数顺序、算法、服务器时间是否正确。

可能回答问题的人

  • 波斯狗儿

    5 粉丝0 提问28 回答
  • galenye

    腾讯 · 工程师 (已认证)

    5 粉丝0 提问36 回答
  • Jinqn

    腾讯 · 高级工程师 (已认证)

    16 粉丝0 提问58 回答
  • 腾讯云技术服务团队

    腾讯云 · 技术服务团队 (已认证)

    20 粉丝0 提问3 回答
  • 宝哥@devops运维

    腾讯 · 高级云计算工程师 (已认证)

    64 粉丝0 提问0 回答
  • elliswu

    腾讯计算机系统有限公司 · 高级工程师 (已认证)

    4 粉丝0 提问0 回答

扫码关注云+社区

领取腾讯云代金券