火山引擎对于每一次的 HTTPS 协议访问请求,会通过访问签名信息中的访问密钥(包括 Access Key ID 和 Secret Access Key),验证访问请求者身份。
账户和有权限的用户可以新建访问密钥,操作如下:
说明
CanonicalRequest = HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' + HexEncode(Hash(RequestPayload))
在签名之前,要将请求正规化,使得签名计算过程无异议,其主要过程及伪代码如下:
字段 | 说明 |
---|---|
HTTPRequestMethod | HTTP 请求方法,例如 POST。 |
CanonicalURI | 正规化后的 URI。如果 URI 为空,那么使用/ 作为绝对路径。 |
CanonicalQueryString | 正规化后的 Query String。Query String 正规化流程如下:
|
CanonicalHeaders | 正规化后的Header。其中伪代码如下:
其中, 注意
|
SignedHeaders | 参与签名的 Header 名称。 签名 Header 需包含在正规化 Headers 名称列表中,用于指明哪些 Header 参与签名计算,从而忽略请求被 Proxy 添加的额外 Header。如果存在 伪代码如下:
|
RequestPayload | 完整的请求的 Body。
|
签名字符串主要包含请求以及正规化请求的元数据信息,由签名算法、请求日期、信任状和正规化请求哈希值连接组成,伪代码如下:
StringToSign = Algorithm + '\n' + RequestDate + '\n' + CredentialScope + '\n' + HexEncode(Hash(CanonicalRequest))
字段说明如下。
字段 | 说明 |
---|---|
Algorithm | 签名的算法。目前火山引擎仅支持 HMAC-SHA256 签名算法。 |
RequestDate | 请求 UTC 时间。请使用YYYYMMDD'T'HHMMSS'Z' 格式。 |
CredentialScope | 凭证范围。格式为YYYYMMDD/region/service/request 。 |
CanonicalRequest | 前序正规化请求的结果。 |
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))
说明
表达式中用{}
内的内容,代表上文计算出的中间过程。
Authorization: HMAC-SHA256 Credential={AccessKeyId}/{CredentialScope}, SignedHeaders={SignedHeaders}, Signature={Signature}
上文中提供了签名过程的伪代码示例,方便您了解签名的计算过程。我们为您提供了 签名过程 Demo,供您参考。
同时,我们推荐您使用 SDK 来进行签名及 API 调用,若您仍需自行编码计算签名,我们还提供了具体语言的 签名代码供您参考。
火山引擎的 OpenAPI 提供了 Java、Golang、PHP、Python、Nodejs 等语言的 SDK。您可以使用 SDK 调用产品的 OpenAPI,您也可以单独使用 SDK 中的签名方法,省去自行编码构造签名的工作。详情请参见 SDK 概览。