对请求进行签名 - Amazon S3 Glacier
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

此页面仅适用于使用保管库的 S3 Glacier 服务的现有客户以及 2012 年以RESTAPI来的原始客户。

如果您正在寻找档案存储解决方案,我们建议您在亚马逊 S3、S3 Glacier 即时检索、S3 Glacier 灵活检索和 S3 Glacier Deep Archive Dee p Archive 中使用 S3 Glacier 存储类。要了解有关这些存储选项的更多信息,请参阅 Amazon S3 用户指南中的 S3 Glacier 存储类和使用 S3 Glacier 存储类的长期数据存储。这些存储类别使用 Amazon S3API,适用于所有区域,并且可以在 Amazon S3 控制台中进行管理。它们提供存储成本分析、存储镜头、高级可选加密功能等功能。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

对请求进行签名

S3 Glacier 要求通过对请求进行签名,验证所发送的每个请求的身份。您使用加密哈希函数计算数字签名,从而对请求签名。加密哈西是根据输入内容返回唯一哈希值的函数。对哈希函数的输入内容包括您的请求文本和秘密访问密钥。哈希函数返回哈希值,您将该值包含在请求中,作为签名。该签名是您的请求的 Authorization 标头的一部分。

收到您的请求后,S3 Glacier 使用与您用于对该请求进行签名的相同哈希函数和输入重新计算签名。如果所得签名与该请求中的签名相匹配,则 S3 Glacier 处理该请求。否则,请求将被拒绝。

S3 Glacier 支持使用Amazon 签名版本 4 进行身份验证。计算签名的过程可分为三个任务:

  • 任务 1:创建规范请求

    将您的HTTP请求重新排列为规范格式。必须使用规范格式,因为 S3 Glacier 在重新计算签名以与您发送的签名进行比较时使用同一规范格式。

  • 任务 2:创建待签字符串

    创建一个字符串,将该字符串用作您的加密哈希函数输入值中的一项。该字符串称为待签字符串,是哈希算法名称、请求日期、凭证范围字符串以及来自上一任务的规范化请求的结合。凭证范围字符串本身就是日期、 Amazon 区域和服务信息的串联。

  • 任务 3:创建签名

    使用加密哈希函数为您的请求创建签名,该函数接受两种输入字符串:待签字符串派生密钥派生密钥的计算方法是从您的私有访问密钥开始,然后使用凭证范围字符串创建一系列基于哈希的消息身份验证代码 () HMACs。请注意,此签名步骤中使用的哈希函数不是 S3 Glacier APIs 中用于上传数据的树形哈希算法。

实例签名计算

以下示例引导您了解为 创建文件库(设置文件库) 创建签名的详细信息。该示例可用作核查您的签名计算方法的参考。有关更多信息,请参阅IAM用户指南》中的签署 Amazon API请求

示例假定以下各项:

  • 请求的时间戳为 Fri, 25 May 2012 00:24:53 GMT

  • 端点为美国东部(弗吉尼亚州北部)区域 us-east-1

一般的请求语法(包括JSON正文)是:

PUT /-/vaults/examplevault HTTP/1.1 Host: glacier.us-east-1.amazonaws.com Date: Fri, 25 May 2012 00:24:53 GMT Authorization: SignatureToBeCalculated x-amz-glacier-version: 2012-06-01

任务 1:创建规范请求计算的规范请求格式为:

PUT /-/vaults/examplevault host:glacier.us-east-1.amazonaws.com x-amz-date:20120525T002453Z x-amz-glacier-version:2012-06-01 host;x-amz-date;x-amz-glacier-version e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

规范请求的最后一行是请求正文的哈希值。另外,请注意规范请求的第三行是空的。这是因为没有用于此的查询参数API。

任务 2:创建待签字符串待签字符串为:

AWS4-HMAC-SHA256 20120525T002453Z 20120525/us-east-1/glacier/aws4_request 5f1da1a2d0feb614dd03d71e87928b8e449ac87614479332aced3a701f916743

待签字符串的第一行是算法,第二行是时间戳,第三行是凭证范围,最后一行是来自任务 1:创建规范请求的规范请求的哈希。要在凭证范围中使用的服务名称为 glacier

对于任务 3:创建签名派生密钥可以表示为:

derived key = HMAC(HMAC(HMAC(HMAC("AWS4" + YourSecretAccessKey,"20120525"),"us-east-1"),"glacier"),"aws4_request")

如果使用秘密访问密钥 wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY,则计算出的签名为:

3ce5b2f2fffac9262b4da9256f8d086b4aaf42eba5f111c21681a65a127b7c2a

最终步骤是构造 Authorization 标头。对于示例访问密钥 AKIAIOSFODNN7EXAMPLE,标头(为了便于阅读,添加了换行符)为:

Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20120525/us-east-1/glacier/aws4_request, SignedHeaders=host;x-amz-date;x-amz-glacier-version, Signature=3ce5b2f2fffac9262b4da9256f8d086b4aaf42eba5f111c21681a65a127b7c2a

为流式处理操作计算签名

上传档案(发布档案)上传段(设置上传 ID)为流式处理操作,这些操作要求您在对请求签名以及发送请求时包括一个附加标头 x-amz-content-sha256。流式处理操作的签名步骤与其他操作的签名步骤完全相同,只是要另外添加流式处理标头。

直播标头的计算基于x-amz-content-sha256要上传的全部内容(有效负载)的SHA256哈希值。请注意,此计算与SHA256树形哈希 (计算校验和) 不同。除了微不足道的情况外,有效载荷数据的 SHA 256哈希值将与有效载荷数据的SHA256树形哈希值不同。

如果将有效载荷数据指定为字节数组,则可以使用以下 Java 代码片段来计算SHA256哈希。

public static byte[] computePayloadSHA256Hash2(byte[] payload) throws NoSuchAlgorithmException, IOException { BufferedInputStream bis = new BufferedInputStream(new ByteArrayInputStream(payload)); MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); byte[] buffer = new byte[4096]; int bytesRead = -1; while ( (bytesRead = bis.read(buffer, 0, buffer.length)) != -1 ) { messageDigest.update(buffer, 0, bytesRead); } return messageDigest.digest(); }

同样,在 C# 中,您可以计算有效载荷数据的SHA256哈希值,如以下代码片段所示。

public static byte[] CalculateSHA256Hash(byte[] payload) { SHA256 sha256 = System.Security.Cryptography.SHA256.Create(); byte[] hash = sha256.ComputeHash(payload); return hash; }

直播签名计算示例 API

以下示例将引导您详细了解为 上传档案(发布档案) S3 Glacier 中的两个流媒体APIs中的一个创建签名。示例假定以下各项:

  • 请求的时间戳为 Mon, 07 May 2012 00:00:00 GMT

  • 端点为美国东部(弗吉尼亚州北部)区域 。

  • 内容有效负载为字符串“Welcome to S3 Glacier”。

一般请求语法(包括JSON正文)如下例所示。请注意,其中包括了 x-amz-content-sha256 标头。在此简化示例中,x-amz-sha256-tree-hashx-amz-content-sha256 是相同的值。但是,对于大于 1MB 的档案上传,情况就不是这样。

POST /-/vaults/examplevault HTTP/1.1 Host: glacier.us-east-1.amazonaws.com Date: Mon, 07 May 2012 00:00:00 GMT x-amz-archive-description: my archive x-amz-sha256-tree-hash: SHA256 tree hash x-amz-content-sha256: SHA256 payload hash Authorization: SignatureToBeCalculated x-amz-glacier-version: 2012-06-01

任务 1:创建规范请求计算的规范请求格式显示如下。请注意,其中包括了流式处理标头 x-amz-content-sha256 及其值。这意味着您必须先读取有效负载并计算SHA256哈希值,然后再计算签名。

POST /-/vaults/examplevault host:glacier.us-east-1.amazonaws.com x-amz-content-sha256:726e392cb4d09924dbad1cc0ba3b00c3643d03d14cb4b823e2f041cff612a628 x-amz-date:20120507T000000Z x-amz-glacier-version:2012-06-01 host;x-amz-content-sha256;x-amz-date;x-amz-glacier-version 726e392cb4d09924dbad1cc0ba3b00c3643d03d14cb4b823e2f041cff612a628

签名计算的其余操作遵循实例签名计算中所述的步骤。使用秘密访问密钥 Authorization 和访问密钥 wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEYAKIAIOSFODNN7EXAMPLE 标头显示如下(为了便于阅读,添加了换行符):

Authorization=AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20120507/us-east-1/glacier/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-glacier-version, Signature=b092397439375d59119072764a1e9a144677c43d9906fd98a5742c57a2855de6