全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件
批量计算

签名机制

更新时间:2017-06-07 13:26:11

BatchCompute通过使用Access Key ID/ Access Key Secret对称加密的方法来验证某个请求的发送者身份。Access Key ID用于标示用户,Access Key Secret是用户用于加密签名字符串和BatchCompute用来验证签名字符串的密钥,其中Access Key Secret必须保密,只有用户和BatchCompute知道。

当用户想以个人身份向BatchCompute发送请求时,需要首先将发送的请求按照BatchCompute指定的格式生成签名字符串;然后使用Access Key Secret对签名字符串进行加密产生验证码。 BatchCompute收到请求以后,会通过Access Key ID找到对应的Access Key Secret,以同样的方法提取签名字符串和验证码,如果计算出来的验证码和提供的一样即认为该请求是有效的;否则,BatchCompute将拒绝处理这次请求,并返回HTTP 400错误。

用户可以在HTTP请求中增加Authorization(授权)的Head来包含签名(Signature)信息,表明这个消息已被授权。

Authorization字段计算方法如下:

  1. Authorization: "acs " + Access Key Id + ":" + Signature
  2. Signature = base64(hmac-sha1(AccessKeySecret + "\n",
  3. + VERB + "\n"
  4. + ACCEPT + "\n"
  5. + CONTENT-MD5 + "\n"
  6. + CONTENT-TYPE + "\n"
  7. + DATE + "\n"
  8. + CanonicalizedBatchComputeHeaders
  9. + CanonicalizedResource))
  • AccessKeySecret表示签名所需的秘钥
  • VERB表示HTTP 请求的Method,主要有PUT,GET,POST,HEAD,DELETE等(大写)
  • CONTENT-MD5表示请求内容数据的MD5值,详情参看(十六进制序列,字母小写)
  • ACCEPT表示HTTP请求期望接受的类型
  • CONTENT-TYPE表示请求内容的类型
  • DATE表示此次操作的时间,且必须为HTTP1.1中支持的GMT格式
  • CanonicalizedOSSHeaders表示以“x-acs-”为前缀的http header的组合
  • CanonicalizedResource 表示API想要访问的BatchCompute资源

其中,CanonicalizedBatchComputeHeaders表示 http中的object meta组合。CanonicalizedResource 表示API想要访问的BatchCompute资源。DATE和CanonicalizedResource不能为空。如果请求中的DATE时间和BatchCompute服务器的时间差正负15分钟以上,BatchCompute服务器将拒绝该服务,并返回HTTP 400错误。其他字段请参考公共请求头参数。

构建CanonicalizedBatchComputeHeaders的方法:

所有以“x-acs-”为前缀的HTTP Header被称为CanonicalizedBatchComputeHeaders,它的构建方法如下:

  1. 将所有以“x-acs-”为前缀的HTTP请求头的名字转换成小写字母。如“X-Acs-Meta-Name: TaoBao”转换成“x-acs-meta-name: TaoBao”;
  2. 将上一步得到的所有HTTP请求头按照字典序进行升序排列;
  3. 如果有相同名字的请求头,则根据标准RFC 2616, 4.2章进行合并(两个值之间只用逗号分隔)。如有两个名为“x-acs-meta-name”的请求头,对应的值分别为“TaoBao”和“Alipay”,则合并后为:“x-acs-meta-name:TaoBao,Alipay”;
  4. 删除请求头和内容之间分隔符两端出现的任何空格。如“x-acs-meta-name: TaoBao,Alipay”转换成:“x-acs-meta-name:TaoBao,Alipay”;
  5. 将所有的头和内容用“\n”分隔符分隔拼成最后的CanonicalizedBatchComputeHeader。

构建CanonicalizedResource的方法:

用户发送请求中想访问的BatchCompute目标资源被称为CanonicalizedResource。它的构建方法如下:

  1. 将CanonicalizedResource置成空字符串(“”);
  2. 放入要访问的BatchCompute资源:“/ResourceName/ResourceId”(无ResourceId则不填);
  3. 如果请求的资源包括子资源(sub-resource) ,那么将所有的子资源按照字典序,从小到大排列并以“&”为分隔符生成子资源字符串。在CanonicalizedResource字符串尾添加“?”和子资源字符串。此时的CanonicalizedResource例子如:/jobs/(id)/tasks?Marker=(Marer)&MaxItemCount=(MaxItemCount)。

例如,想签名以下信息:

  1. PUT /jobs/job-000000005645B53B0000AEA300000001 HTTP/1.0
  2. Content-Md5: 900150983cd24fb0d6963f7d28e17f72
  3. Content-Type: application/json
  4. Date: Thu, 17 Nov 2005 18:49:58 GMT
  5. Host: batchcompute.cn-qingdao.aliyuncs.com
  6. x-acs-signature-method: HMAC-SHA1
  7. x-acs-signature-version: 1.0

假如Access Key ID是:“44CF9590006BF252F707”, Access Key Secret是“OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV”,可用以下方法签名(Signature):

python示例代码:

  1. import base64
  2. import hmac
  3. import sha
  4. h = hmac.new("OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV",
  5. "PUT\n900150983cd24fb0d6963f7d28e17f72\napplication/json\nThu, 17 Nov 2005 18:49:58 GMT\nx-acs-signature-method:HMAC-SHA1\nx-acs-signature-version:1.0\n/jobs/job-000000005645B53B0000AEA300000001", sha)
  6. base64.encodestring(h.digest()).strip()

签名(Signature)计算结果应该为“26NBxoKdsyly4EDv6inkoDft/yA=”, 然后加上Authorization头来组成最后需要发送的消息:

  1. PUT /jobs/job-000000005645B53B0000AEA300000001 HTTP/1.0
  2. Authorization: acs 44CF9590006BF252F707: 26NBxoKdsyly4EDv6inkoDft/yA=
  3. Content-Md5: 900150983cd24fb0d6963f7d28e17f72
  4. Content-Type: application/json
  5. Date: Thu, 17 Nov 2005 18:49:58 GMT
  6. Host: batchcompute.cn-qingdao.aliyuncs.com
  7. x-acs-signature-method: HMAC-SHA1
  8. x-acs-signature-version: 1.0

在计算签名头的时候请遵循如下规则:

  1. 用来签名的字符串必须为UTF-8格式。含有中文字符的签名字符串必须先进UTF-8编码,再与Access Key Secret计算最终签名。
  2. 签名的方法用RFC 2104 中定义的HMAC-SHA1方法,其中Key为Access Key Secret。
  3. Content-Type和Content-MD5在请求中不是必须的,但是如果请求需要签名验证,空值的话以换行符“\n”代替。
  4. 在所有非HTTP标准定义的header中,只有以“x-acs-”开头的header,需要加入签名字符串;其他非HTTP标准header将被忽略。
  5. 以“x-acs-”开头的head在签名验证前需要符合以下规范:
    • head的名字需要变成小写。
    • head按字典序自小到大排序。
    • 分割head name和value的冒号前后不能有空格。
    • 每个Head之后都有一个换行符“\n”,如果没有Head,CanonicalizedBatchComputeHeaders就设置为空。

备注:BatchCompute所有的请求都必须使用HTTP 1.1协议规定的GMT时间格式。其中,日期的格式有三种:

date1 = 2DIGIT SP month SP 4DIGIT; day month year (e.g., 02 Jun 1982)
date2 = 2DIGIT “-“ month “-“ 2DIGIT; day-month-year (e.g., 02-Jun-82)
date3 = month SP ( 2DIGIT or ( SP 1DIGIT )); month day (e.g., Jun 2) 【注意“2”前面有两个空格】

述这三种日期格式中,“天”所占位数都是“2 DIGIT”。因此,“Jun 2”、“2 Jun 1982”和“2-Jun-82”都是非法日期格式。

本文导读目录