应用的公钥/密钥,在【火山引擎】->【控制台】-> 【右上角个人信息】->【访问控制】->【用户管理】->【AccessKey管理】中获取
Hash代指SHA256算法
HexEncode代指转16进制编码
CanonicalRequest = HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' + HexEncode(Hash(RequestPayload))
在签名之前,首先要将请求正规化,目的是让签名计算过程无异议,其主要过程及伪代码如下:
指代http请求的method,例如:GET、POST等。
指代正规化后的URI。如果URI为空,那么使用"/"作为绝对路径。在火山引擎中绝大多数接口的URI都为"/"。如果是复杂的path,请通过RFC3986规范进行编码。例如请求为:
指代正规化后的Query String。对于Query String的正规化大致的过程如下:
CanonicalQueryString = "Action=ListUsers&Version=2018-01-01"
CanonicalHeaders:
指代正规化后的Header。其中伪代码如下:
CanonicalHeaders = CanonicalHeadersEntry0 + CanonicalHeadersEntry1 + ... + CanonicalHeadersEntryN
其中
CanonicalHeadersEntry = Lowercase(HeaderName) + ':' + Trimall(HeaderValue) + '\n'
Lowcase代表将Header的名称全部转化成小写,Trimall表示去掉Header的值的前后多余的空格。
特别注意:最后需要添加"\n"的换行符,header的顺序是以headerName的小写后ascii排序。
代指参与签名的header名称。签名header是包含在正规化headers中名称列表,其目的是指明哪些header参与签名计算,从而忽略请求被proxy添加的额外header,其中host、x-date两个header如果存在则必须添加进来,伪代码如下:
SignedHeaders = Lowercase(HeaderName0) + ';' + Lowercase(HeaderName1) + ";" + ... + Lowercase(HeaderNameN)
指代完整的请求的body。
签名字符串主要包含请求以及正规化请求的元数据信息,由签名算法、请求日期、信任状和正规化请求哈希值连接组成,伪代码如下:
StringToSign = Algorithm + '\n' + RequestDate + '\n' + CredentialScope + '\n' + HexEncode(Hash(CanonicalRequest))
Algorithm
指代签名的算法,目前火山引擎仅支持HMAC-SHA256的签名算法。
指代请求UTC时间,请使用如下格式:YYYYMMDD'T'HHMMSS'Z' 。
指代信任状,格式为: YYYYMMDD / region / service /request。
指代上一小节正规化请求的结果。
在计算签名前,首先从私有访问密钥(secret AccessKey)派生出签名密钥(signing key),而不是直接使用私有访问密钥。具体计算过程如下:
kSecret = *Your Secret Access Key* kDate = HMAC(kSecret, Date) kRegion = HMAC(kDate, Region) kService = HMAC(kRegion, Service) kSigning = HMAC(kService, "request")
计算签名
Signature = HexEncode(HMAC(kSigning, StringToSign))
然后构建header
Authorization: HMAC-SHA256 Credential={AccessKeyId}/{CredentialScope}, SignedHeaders={SignedHeaders}, Signature={Signature}
表达式中用{}括起来的代表上文计算出的中间过程。