开发者社区> 问答> 正文

API签名机制是怎样的?

API签名机制是怎样的?

展开
收起
小天使爱美 2020-03-31 20:57:48 833 0
1 条回答
写回答
取消 提交回答
  • 本文主要介绍签名机制。

    签名机制说明 Access Key ID 和 Access Key Secret 由阿里云官方颁发给访问者(可以通过阿里云官方网站申请和管理),其中 Access Key ID 用于标识访问者的身份;Access Key Secret 是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密,只有阿里云和用户知道。

    容器服务会对每个访问的请求进行验证,每个向容器服务提交的请求,都需要在请求中包含签名(Signature)信息。容器服务通过使用 Access Key ID 和 Access Key Secret 进行对称加密的方法来验证请求的发送者身份。如果计算出来的验证码和提供的一样即认为该请求是有效的;否则,容器服务将拒绝处理这次请求,并返回 HTTP 403 错误。

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

    容器服务要求将签名包含在 HTTP Header 中,格式为 Authorization: acs [Access Key Id]:[Signature]。

    Signature 的计算方法如下:

    Signature = base64(hmac-sha1(VERB + "\n" + ACCEPT + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Date + "\n" + CanonicalizedHeaders + "\n" + CanonicalizedResource)) VERB 表示 HTTP 的 Method。例如示例中的 PUT。 Accept 客户端需要的返回值类型,支持 application/json 和 application/xml。 Content-MD5 表示请求内容数据的 MD5 值。 Content-Type 表示请求内容的类型。 Date 表示此次操作的时间,不能为空,目前只支持 GMT 格式。如果请求时间与 CAS 服务器时间相差超过 15分钟,CAS 会判定此请求不合法,并返回 400 错误。错误信息及错误码详见本文档第 5 部分。例如示例中的 Thu, 17 Mar 2012 18:49:58 GMT。 CanonicalizedHeaders 表示 HTTP 中以 x-acs- 开始的字段组合。 CanonicalizedResource 表示 HTTP 所请求资源的 URI(统一资源标识符)。例如示例中的 /clusters?name=my-clusters&resource=new。 说明 CanonicalizedHeaders(即以 x-acs- 开头的 header)在签名验证前需要符合以下规范: 将所有以 x-acs- 为前缀的 HTTP 请求头的名字转换成小写字母。例如将 X-ACS-Meta-Name: TaoBao 转换为 x-acs-meta-name: TaoBao。阿里云规范请求头的名字是大小写不敏感的,建议全部使用小写。 如果一个公共请求头的值部分过长,则需要处理其中的 \t、\n、\r、\f分隔符,将其替换为英文半角的空格。 将上一步得到的所有 HTTP 阿里云规范头按照字典序进行升序排列。 删除请求头和内容之间分隔符两端出现的任何空格。例如将 x-acs-meta-name: TaoBao,Alipay 转换为 x-acs-meta-name:TaoBao,Alipay。 将所有的头和内容用 \n 分隔符分隔拼成最后的 CanonicalizedHeaders。 说明 CanonicalizedResource 的格式规范:CanonicalizedResource 表示客户想要访问资源的规范描述,需要将子资源和 qurey 一同按照字典序,从小到大排列并以 & 为分隔符生成子资源字符串(? 后的所有参数)。 http://cs.aliyuncs.com/clusters?name=my-clusters&resource=new CanonicalizedResource 应该为:

    /clusters?name=my-clusters&resource=new 签名示例 您可以通过该示例,了解加签的步骤。

    示例使用的 accessKeyId 和 accessKeySecret 分别为 access_key_id 和 access_key_secret。推荐您使用自己的 OpenAPI 调用程序,来计算下面这个示例的加签串,您自己的加签结果和示例结果。

    请求的示例如下:

    POST http://cs.aliyuncs.com/clusters?param1=value1&param2=value2 HTTP/1.1 Accept-Encoding: identity Content-Length: 210 Content-MD5: 6U4ALMkKSj0PYbeQSHqgmA==
    x-acs-version: 2015-12-15 Accept: application/json User-Agent: cs-sdk-python/0.0.1 (Darwin/15.2.0/x86_64;2.7.10) x-acs-signature-nonce: fbf6909a-93a5-45d3-8b1c-3e03a7916799 x-acs-signature-version: 1.0 Date: Wed, 16 Dec 2015 12:20:18 GMT x-acs-signature-method: HMAC-SHA1 Content-Type: application/json;charset=utf-8 X-Acs-Region-Id: cn-beijing
    Authorization: acs : {"password": "Just$ ","instance_type": "ecs.m2.medium","name": "my-test-cluster-9708","size": 1,"network_mode": "vpc","data_disk_category": "cloud","data_disk_size": 10,"ecs_image_id": "m-253l****l"} 请求构造过程

    计算 Content-Length 和 Content-MD5

    Content-Length 说明 示例 body 首位没有空格或换行符。 body: {"password": "Just$","instance_type": "ecs.m2.medium","name": "my-test-cluster-9708","size": 1,"network_mode": "vpc","data_disk_category": "cloud","data_disk_size": 10,"ecs_image_id": "m-253ll****"} Content-Length: 210 Content-MD5

    body: {"password": "Just$","instance_type": "ecs.m2.medium","name": "my-test-cluster-9708","size": 1,"network_mode": "vpc","data_disk_category": "cloud","data_disk_size": 10,"ecs_image_id": "m-253ll****"}

    计算 body 的 md5 值

    md5(body): e94e002cc90a4a3d0f61b790487aa098

    将 md5 值转化成字节数组。将 md5 中的每两个十六进制位合并,转化为一个字节。

    例如:e9 -> 11111111111111111111111111101001 -> -23

    bytes(md5(body)): {[-23], [78], [0], [44], [-55], [10], [74], [61], [15], [97], [-73], [-112], [72], [122], [-96], [-104]}

    将得到的字节数组做一个 base64 转换

    base64(bytes(md5(body))): 6U4ALMkKSj0PYbeQSHqgmA== Content-MD5: 6U4ALMkKSj0PYbeQSHqgmA== 处理 CanonicalizedHeaders

    将所有以‘x-acs-’开头的头部列出来

    x-acs-version: 2015-12-15
    x-acs-signature-nonce: ca480402-7689-43ba-acc4-4d2013d9d8d4 x-acs-signature-version: 1.0 x-acs-signature-method: HMAC-SHA1 X-Acs-Region-Id: cn-beijing

    将请求名字变成小写,去掉每一行首尾的空格,并按照字典序进行排序。删除请求头和内容之间分隔符两端出现的任何空格。

    注意:最后一行没有换行符。

    x-acs-region-id:cn-beijing x-acs-signature-method:HMAC-SHA1 x-acs-signature-nonce:fbf6909a-93a5-45d3-8b1c-3e03a7916799 x-acs-signature-version:1.0 x-acs-version:2015-12-15 计算 CanonicalizedResource

    示例得到的 CanonicalizedResource,长度应该为 27。

    说明 第一行行尾有一个 \n 的换行符。 /clusters?param1=value1&param2=value2 计算 Signature

    组装 SignatureString。示例中的加签字符串的长度为 307。除最后一行外,每一行行尾均有一个\n的换行符。

    POST application/json 6U4ALMkKSj0PYbeQSHqgmA== application/json;charset=utf-8 Wed, 16 Dec 2015 12:20:18 GMT x-acs-region-id:cn-beijing x-acs-signature-method:HMAC-SHA1 x-acs-signature-nonce:fbf6909a-93a5-45d3-8b1c-3e03a7916799 x-acs-signature-version:1.0 x-acs-version:2015-12-15 /clusters?param1=value1&param2=value2 计算 Signature

    使用 accessKeySecret 来对加签字符串进行加密,其中示例使用的 accessKeySecret 是 access_key_secret。

    hmac-sha1(SignatureString): fee03d405e421ebaf514adec881038c4b313584d

    类似于 Content-MD5 的计算方式,将得到的加密串转化成字节数组。

    将得到的字符数组做一个 base64 转换。得到最后的签名串。

    base64(bytes(hmac-sha1(SignatureString))): ZmVlMDNkNDA1ZTQyMWViYWY1MTRhZGVjODgxMDM4YzRiMzEzNTg0ZA== Signature: ZmVlMDNkNDA1ZTQyMWViYWY1MTRhZGVjODgxMDM4YzRiMzEzNTg0ZA== 经过以上的处理,添加一些其他头部信息,最终构成的 HTTP 请求如下所示。

    POST http://cs.aliyuncs.com/clusters?param1=value1&param2=value2 HTTP/1.1 Accept-Encoding: identity Content-Length: 210 Content-MD5: 6U4ALMkKSj0PYbeQSHqgmA==
    x-acs-version: 2015-12-15 Accept: application/json User-Agent: cs-sdk-python/0.0.1 (Darwin/15.2.0/x86_64;2.7.10) x-acs-signature-nonce: fbf6909a-93a5-45d3-8b1c-3e03a7916799 x-acs-signature-version: 1.0 Date: Wed, 16 Dec 2015 12:20:18 GMT x-acs-signature-method: HMAC-SHA1 Content-Type: application/json;charset=utf-8 X-Acs-Region-Id: cn-beijing
    Authorization: acs : {"password": "Just$ ","instance_type": "ecs.m2.medium","name": "my-test-cluster-9708","size": 1,"netwo

    2020-03-31 20:58:05
    赞同 展开评论 打赏
问答分类:
API
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Boot2.0实战Redis分布式缓存 立即下载
CUDA MATH API 立即下载
API PLAYBOOK 立即下载