URL预签名

2022-09-22 16:06:39

预签名

您可以使用查询字符串参数提供身份验证信息。 当您想在URL中完全表达请求时,使用查询参数来验证请求很有用。 此方法也称为预指定URL。

预签名URL的用例场景是您可以授予对棱束对象存储资源的临时访问权限。 例如,您可以在网站上嵌入预先分配的URL,或者在命令行客户端(如Curl)中使用它来下载对象。

以下是presign示例。

https://s3.amazonaws.com/examplebucket/test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=<your-access-key-id>/20130721/us-east-1/s3/aws4_request
&X-Amz-Date=20130721T201207Z
&X-Amz-Expires=86400
&X-Amz-SignedHeaders=host
&X-Amz-Signature=<signature-value>

在示例网址中,请注意以下事项:

添加换行符是为了可读性。

URL中的X-Amz-Credential值仅显示“/”字符,以便于阅读。 实际上,它应该编码为%2F。 例如:

  • &X-Amz-Credential=<your-access-key-id>%2F20130721%2Fus-east-1%2Fs3%2Faws4_request
    

下表介绍了提供身份验证信息的URL中的查询参数。

参数名 描述
X-Amz-Algorithm 标识AWS签名的版本以及用于计算签名的算法。对于AWS签名版本4,您将此参数值设置为AWS4-HMAC-SHA256。
X-Amz-Credential 除了您的访问密钥ID之外,此参数还提供签名有效的范围(AWS区域和服务)。 此值必须与在签名计算中使用的范围相匹配,如以下部分所述。 此参数值的一般形式如下:*<**your-access-key-id**>*/*<**date**>*/*<**AWS-region**>*/*<**AWS-service**>*/aws4_request
X-Amz-Date 日期和时间格式必须遵循ISO 8601标准,并且必须使用“yyyyMMddTHHmmssZ”格式进行格式化。 例如,如果日期和时间为“08/01/2016 15:32:41.982-700”,则必须首先将其转换为UTC(协调世界时),然后提交为“20160801T083241Z”。
X-Amz-Expires 提供生成的预先分配的URL有效的时间段(以秒为单位)。 例如,86400(24小时)。 此值为整数。 您可以设置的最小值为1,最大值为1296000(十五天)。预先分配的网址最长有效期为15天。
X-Amz-SignedHeaders 列出用于计算签名的头。 签名计算中需要以下标头: HTTP host header。 您计划要包含在请求中的任何x-amz- *标头也必须添加。
X-Amz-Signature 提供签名以验证您的请求。 此签名必须与棱束链对象存储计算的签名相匹配; 否则,棱束链对象存储会拒绝该请求。 例如, 733255ef022bec3f2a8701cd61d4b371f3f28c9f193a1f02279211d48d5193d7

签名过程

请参阅授权头的签名计算。 该过程通常是相同的,除了创建CanonicalRequest不同如下:

  • 您不在规范请求中包括有效负载哈希,因为在创建预分配的URL时,您不知道有效负载内容,因为该URL用于上传任意有效负载。 相反,您使用常量字符串UNSIGNED-PAYLOAD。
  • 规范查询字符串必须包括上表中除X-Amz-Signature之外的所有查询参数。
  • 规范报头必须包括HTTP主机头。 如果计划包括任何x-amz- *头,还必须添加这些头以进行签名计算。 您可以选择添加计划在请求中包含的所有其他标头。 为了增加安全性,您应该尽可能多地标记标头。

示例:签名计算

假设你的examplebucket桶中有一个对象test.txt。 您想要通过创建预先分配的URL与其他人共享此对象,持续24小时(86400秒)。

https://s3.amazonaws.com/examplebucket/test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request
&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host
&X-Amz-Signature=<signature-value>

以下步骤首先说明签名计算,然后构造预签名的URL。

您可以使用此示例作为测试用例来验证代码计算的签名; 但是,必须使用相同的存储桶名称,对象键,时间戳和以下示例凭据:

示例账号信息

Parameter Value
AWSAccessKeyId AKIAIOSFODNN7EXAMPLE
AWSSecretAccessKey ****************

生成待签名字符串

规范化请求

GET
/test.txt
X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host
host:examplebucket.s3.amazonaws.com

host
UNSIGNED-PAYLOAD

生成待签名字符串

AWS4-HMAC-SHA256
20130524T000000Z
20130524/us-east-1/s3/aws4_request
3bfa292879f6447bbcda7001decf97f4a54dc650c8942174ae0a9121cf58ad04

生成签名秘钥

signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request")

签名

aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404

现在,您有了构建预签名URL的所有信息。 此示例的结果网址如下所示(您可以使用此网址比较您的预先分配的网址):

https://examplebucket.s3.amazonaws.com/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404