对请求进行签名 - Amazon Glacier

此页面仅适用于使用 Vaults 和 2012 年原始 REST API 的 Amazon Glacier 服务的现有客户。

如果您正在寻找档案存储解决方案,我们建议您在亚马逊 S3、S3 Glacier 即时检索、S3 Glacier 灵活检索和 S3 Glacier Deep Archive Deep Archive 中使用 Amazon Glacier 存储类。要了解有关这些存储选项的更多信息,请参阅 Amazon Glacier 存储类别

从 2025 年 12 月 15 日起,Amazon Glacier(最初基于保管库的独立服务)将不再接受新客户,对现有客户不产生任何影响。Amazon Glacier 是一项独立的服务 APIs ,拥有自己的服务,可将数据存储在文件库中,不同于亚马逊 S3 和 Amazon S3 Glacier 存储类别。在 Amazon Glacier 中,您的现有数据将保持安全且可以无限期地访问。无需迁移。对于低成本、长期的存档存储, AWS 建议使用 Amazon S3 Glacier 存储类别,这些存储类别基于S3存储桶 APIs、完全 AWS 区域 可用性、更低的成本和 AWS 服务集成,可提供卓越的客户体验。如果您想要增强功能,可以考虑使用我们的AWS 解决方案指南迁移到 Amazon S3 Glacier 存储类别,将数据从 Amazon Glacier 文件库传输到 Amazon S3 Glacier 存储类

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

对请求进行签名

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

收到您的请求后,Amazon Glacier 会使用您签署请求时使用的相同哈希函数和输入重新计算签名。如果生成的签名与请求中的签名相匹配,Amazon Glacier 就会处理该请求。否则,请求将被拒绝。

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

  • 任务 1:创建规范请求

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

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

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

  • 任务 3:创建签名

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

实例签名计算

以下示例引导您了解为 创建文件库(设置文件库) 创建签名的详细信息。该示例可用作核查您的签名计算方法的参考。有关更多信息,请参阅 I AM 用户指南中的签署 AWS 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 的示例签名计算

以下示例将引导您详细了解创建签名的详细信息上传档案(发布档案),该签名是 Amazon Glacier APIs 中直播的两个签名之一。示例假定以下各项:

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

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

  • 内容有效载荷是一个字符串 “欢迎来到 Amazon 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