最近更新时间:2024.01.15 12:12:54
首次发布时间:2021.02.25 21:02:47
推荐使用API Explorer的签名自动生成功能,只需输入ak、sk、服务地址等信息,将会自动生成请求签名和可执行的curl命令,分步骤展示签名的生成过程。
说明
以下提供了签名过程的伪代码示例,方便您了解签名的计算过程。我们推荐您使用火山引擎SDK、 API Explorer来进行签名及API调用。若您仍需自行编码计算签名,我们还提供了具体语言的签名代码供您参考。
示例中使用的Access Key如下:
Access Key ID:
AKLTMjI2ODVlYzI3ZGY1NGU4ZjhjYWRjMTlmNTM5OTZkYzE
Secret Access Key:
TnpCak5XWXpZV1U0WkRaaE5ERmxaR0ZpTmpjeVkyUXlZek0wTWpJMU1qWQ==
原始请求为:
GET https://iam.volcengineapi.com/?Action=ListUsers&Version=2018-01-01&Limit=10&Offset=0 HTTP/1.1 Host: iam.volcengineapi.com Content-Type: application/x-www-form-urlencoded; charset=utf-8 X-Content-Sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 X-Date:20201230T081805Z
签名过程如下:
规范请求如下
CanonicalRequest = HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' + HexEncode(Hash(RequestPayload))
HTTPRequestMethod
GET
CanonicalURI
/
CanonicalQueryString
Action=ListUsers&Limit=10&Offset=0&Version=2018-01-01
CanonicalHeaders
将需要参与签名的header的key全部转成小写, 然后以ASCII排序后以key-value的方式组合后换行构建。注意需要在结尾增加一个回车换行\n
。
content-type:application/x-www-form-urlencoded; charset=utf-8 host:iam.volcengineapi.com x-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-date:20201230T081805Z
SignedHeaders
content-type;host;x-content-sha256;x-date
HexEncode(Hash(RequestPayload))
无论是GET请求还是POST请求都有 RequestPayload ,其中本次GET请求中的RequestPayload是空字符串。
这里的hash算法代指: sha 256 []byte
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
最终CanonicalRequest
GET / Action=ListUsers&Limit=10&Offset=0&Version=2018-01-01 content-type:application/x-www-form-urlencoded; charset=utf-8 host:iam.volcengineapi.com x-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-date:20201230T081805Z content-type;host;x-content-sha256;x-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
StringToSign = Algorithm + '\n' + RequestDate + '\n' + CredentialScope + '\n' + HexEncode(Hash(CanonicalRequest))
Algorithm
目前是一个固定的字符串
HMAC-SHA256
RequestDate
请求发起的时间, 与X-Date相同。
20201230T081805Z
CredentialScope
指代信任状,格式为:${YYYYMMDD}/${region}/${service}/request
,其中${YYYYMMDD}
取X-Date中的日期,${region}
和${service}
参考公共参数的Region及Service取值,request
为固定值。
此请求信息如下:
20201230/cn-north-1/iam/request
HexEncode(Hash(CanonicalRequest))
3a4d4dee07c3308a52da01bc12d7a83c3705bfa543f51648f46de880bb2a7447
最终StringToSign
HMAC-SHA256 20201230T081805Z 20201230/cn-north-1/iam/request 3a4d4dee07c3308a52da01bc12d7a83c3705bfa543f51648f46de880bb2a7447
HMAC这里代指HMAC-SHA256
Signingkey示例
HMAC(HMAC(HMAC(HMAC(kSecret,"20201230"),"cn-north-1"),"iam"),"request")
以下示例显示了此 HMAC 哈希操作序列生成的派生签名密钥。这说明了此二进制签名密钥中每个字节的十六进制表示形式。
e7d2eb478084eaaaf8f85c161de16f13d97e52e77bd0415f33e7feb561cccffd
Signature示例
signature = HexEncode(HMAC(Signingkey, StringToSign))
最终的结果如下:
28eeabbbd726b87002e0fe58ad8c1c768e619b06e2646f35b6ad7ed029a6d8a7
在请求中增加Authorization的header如下:
Authorization: HMAC-SHA256 Credential={AccessKeyId}/{CredentialScope}, SignedHeaders={SignedHeaders}, Signature={Signature}
完整结果如下:
HMAC-SHA256 Credential=AKLTMjI2ODVlYzI3ZGY1NGU4ZjhjYWRjMTlmNTM5OTZkYzE/20201230/cn-north-1/iam/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=28eeabbbd726b87002e0fe58ad8c1c768e619b06e2646f35b6ad7ed029a6d8a7