全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:签名机制

更新时间:Aug 30, 2023

为保证API的安全调用,在调用API时阿里云会对每个API请求通过签名(Signature)进行身份验证。无论使用HTTP还是HTTPS协议提交请求,都需要在请求中包含签名信息。本文指导您如何进行签名处理。

对于每一次HTTP或者HTTPS协议请求,阿里云会根据访问中的签名信息验证访问请求者身份。您在访问时签名信息时,请按照以下方法对请求进行签名处理:

步骤一:构造规范化请求头

阿里云规范化请求头(CanonicalizedHeaders)是非标准HTTP头部信息。是指请求中出现的以x-acs-为前缀的参数信息,构造方法如下:

  • 将所有以x-acs-为前缀的HTTP请求头的名称转换成小写字母。如X-acs-Meta-Name: TaoBao转换成x-acs-meta-name: TaoBao。阿里云规范请求头的名称大小写不敏感,建议全小写。

  • 如果一个公共请求头的值过长,则需要处理其中的\t\n\r\f分隔符,将其替换成英文半角的空格。

  • 将上一步得到的所有HTTP阿里云规范头按照字典顺序进行升序排列。

  • 删除请求头的名称和值之间的分隔符两端出现的任何空格。例如x-acs-oss-meta-name : TaoBao,Alipay转换成x-acs-oss-meta-name:TaoBao,Alipay

  • 在每一个请求头后添加一个\n分隔符(包括最后一个请求头),然后将所有请求头拼接在一起即获得CanonicalizedHeaders。

步骤二:构造规范化资源

规范化资源(CanonicalizedResource) 表示您想要访问资源的规范描述,具体构造方式如下:

  1. 将请求的查询字符串(queryString)中的参数按照参数名称的字典序重新排序,并以&分隔符连接生成已排序查询字符串。

    如果本次请求没有携带查询字符串,则跳过此步骤。

  2. 将请求资源路径(指URL中host与查询字符串之间的部分,包含host之后的/但不包含查询字符串前的?)与已排序查询字符串以?拼接,得到规范化资源。当查询字符串不存在时,直接用请求资源路径作为规范化资源。

示例

原始请求URL:

http://demo-product.aliyuncs.com/instances?status=ONLINE&group=test_group

规范化资源:

/instances?group=test_group&status=ONLINE

步骤三:构造待签名字符串

按照以下伪代码构造待签名字符串(StringToSign):

StringToSign = 
    HTTP-Verb + "\n" +
    Accept + "\n" +
    Content-MD5 + "\n" +
    Content-Type + "\n" +
    Date + "\n" +
    CanonicalizedHeaders +
    CanonicalizedResource

参数

描述

HTTP-Verb

大写的HTTP方法名,例如POST、GET。

Accept

Accept请求头的值,当请求头不存在时,使用空字符串代替。

Content-MD5

Content-MD5请求头的值,当请求头不存在时,使用空字符串代替。

Content-Type

Content-Type请求头的值,当请求头不存在时,使用空字符串代替。

Date

Date请求头的值。

CanonicalizedHeaders

步骤一:构造规范化请求头中获得的规范化请求头。

CanonicalizedResource

步骤二:构造规范化资源中获得的规范化资源。

步骤四:计算签名

根据RFC2104的定义,按照HMAC-SHA1算法对上一步生成的待签名字符串进行签名计算,并以Base64编码规则将计算结果编码成字符串,即得到最终的签名值(Signature)。

Signature = Base64( HMAC-SHA1( SigningKey, StringToSign ) )
重要

计算签名时使用的SigningKey值就是您的AccessKey Secret。更多信息,请参见创建AccessKey

步骤五:将签名添加到请求中

计算出签名结果Signature后,按照以下规则拼接字符串,并将结果作为Authorization请求头的值。

Authorization = "acs " + AccessKeyId + ":" + Signature