You need to enable JavaScript to run this app.
导航

签名机制

最近更新时间2023.06.30 15:23:33

首次发布时间2023.06.30 15:23:33

火山引擎对于每一次的 HTTPS 协议访问请求,会通过访问签名信息中的访问密钥(包括 Access Key ID 和 Secret Access Key),验证访问请求者身份。

获取访问密钥

账户和有权限的用户可以新建访问密钥,操作如下:

  1. 使用主账号或拥有密钥管理权限的 IAM 用户登录 访问控制控制台
  2. 在左侧导航栏选择 资源管理 > 密钥管理
  3. 查看您账号的访问密钥列表。
    • 每个账号最多同时拥有 2 个访问密钥。
    • 如果当前账号的访问密钥数量未达到上限,则可单击 新建密钥,创建新的访问密钥。创建完成后单击 查看AccessKey详情,查看新的访问密钥信息。

创建一个正规化请求

说明

  • Hash 代指 SHA256 算法。
  • HexEncode 代指转 16 进制编码。
CanonicalRequest = HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' + HexEncode(Hash(RequestPayload))

在签名之前,要将请求正规化,使得签名计算过程无异议,其主要过程及伪代码如下:

字段说明
HTTPRequestMethodHTTP 请求方法,例如 POST。
CanonicalURI正规化后的 URI。如果 URI 为空,那么使用/作为绝对路径。

CanonicalQueryString

正规化后的 Query String。Query String 正规化流程如下:

  1. URL 编码(UrlEncode)每个 Query String 参数名称和参数值。
  2. 按照 ASCII 字节顺序对参数名称严格排序。
  3. 将排序好的参数名称和参数值用=连接;按照排序结果将参数对用&连接。

    CanonicalQueryString = "Action=ListUsers&Version=2018-01-01"
    

CanonicalHeaders

正规化后的Header。其中伪代码如下:

CanonicalHeaders = CanonicalHeadersEntry0 + CanonicalHeadersEntry1 + ... + CanonicalHeadersEntryN
CanonicalHeadersEntry = Lowercase(HeaderName) + ':' + Trimall(HeaderValue) + '\n'

其中,Lowercase表示将 Header 的名称全部转化成小写,Trimall表示去掉 Header 的值的前后多余空格。

注意

  • 结尾需要添加 \n 换行符。
  • Header 的顺序由headerName的小写后 ASCII 排序。

SignedHeaders

参与签名的 Header 名称。

签名 Header 需包含在正规化 Headers 名称列表中,用于指明哪些 Header 参与签名计算,从而忽略请求被 Proxy 添加的额外 Header。如果存在hostx-date两个 Header,则必须添加到正规化 Headers 名称列表中。

伪代码如下:

SignedHeaders = Lowercase(HeaderName0) + ';' + Lowercase(HeaderName1) + ";" + ... + Lowercase(HeaderNameN)
RequestPayload完整的请求的 Body。
  • URL 编码(同 RFC3986 方法) 每个 Query String 参数名称和参数值

    其中 GET 方法需要包含哈希算法、信任状、签名日期和签名 Header 等全部参数。

  • 按照 ASCII 字节顺序对参数名称严格排序。
  • 将排序好的参数名称和参数值用=连接;按照排序结果将参数对用&连接。

创建签名字符串

签名字符串主要包含请求以及正规化请求的元数据信息,由签名算法、请求日期、信任状和正规化请求哈希值连接组成,伪代码如下:

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前序正规化请求的结果。

计算签名秘钥

  1. 计算签名前,首先从 Secret Access Key 派生出签名密钥(Signing Key),而不是直接使用 Secret Access Key。具体计算过程如下:
    kSecret = *Your Secret Access Key*
    kDate = HMAC(kSecret, Date)
    kRegion = HMAC(kDate, Region)
    kService = HMAC(kRegion, Service)
    kSigning = HMAC(kService, "request")
    
  2. 计算签名。
    Signature = HexEncode(HMAC(kSigning, StringToSign))
    
  3. 构建 Header。

    说明

    表达式中用{}内的内容,代表上文计算出的中间过程。

    Authorization: HMAC-SHA256 Credential={AccessKeyId}/{CredentialScope}, SignedHeaders={SignedHeaders}, Signature={Signature}
    

签名示例和 SDK

签名示例

上文中提供了签名过程的伪代码示例,方便您了解签名的计算过程。我们为您提供了 签名过程 Demo,供您参考。

同时,我们推荐您使用 SDK 来进行签名及 API 调用,若您仍需自行编码计算签名,我们还提供了具体语言的 签名代码供您参考。

SDK 参考

火山引擎的 OpenAPI 提供了 Java、Golang、PHP、Python、Nodejs 等语言的 SDK。您可以使用 SDK 调用产品的 OpenAPI,您也可以单独使用 SDK 中的签名方法,省去自行编码构造签名的工作。详情请参见 SDK 概览