Go 实现 AWS4 请求认证 | Go主题月
什么是 Amazon S3?它是 AWS 提供的一种对象存储服务,提供行业领先的可扩展性、数据可用性、安全性和性能。Amazon S3 可达到 99.999999999%(11 个 9)的持久性。
Amazon S3 里用到了 AWS Signature Version 4
(下面简称 AWS4
)做认证请求,这篇文章将会讲解如何使用 Go 实现 AWS4 请求认证。
AWS4 是一种用于对所有 AWS 区域服务的入站 API 请求进行身份验证的协议。
AWS4
AWS4 对请求进行签名有以下优势(但这也取决于你如何使用):
- 验证请求者的身份 - 经过身份验证的请求需要使用
AccessKeyID
和SecretAccessKey
创建签名。 - 保护传输中的数据 - 为了防止在传输过程中对请求进行篡改,可以使用一些请求元素(比如
请求路径
、请求头
等)来计算请求签名。Amazon S3 在收到请求后,使用相同的请求元素来计算签名。如果 Amazon S3 接收到的任何请求组件与用于计算签名的组件不匹配,Amazon S3 将拒绝该请求。 - 防止重用请求的签名部分 - 请求的签名部分在请求中的时间戳的一段时间内有效。
授权方式
- HTTP 身份验证头,例如
Authorization
请求头:
Authorization: AWS4-HMAC-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,
SignedHeaders=host;range;x-amz-date,
Signature=fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024
- URL 查询字符串参数,例如预签名 URL:
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>
Go 实现 HTTP 身份验证头
HTTP 身份验证头组成部分
- AWS4-HMAC-SHA256 - 该字符串指定 AWS4 和签名算法(HMAC-SHA256)。
- Credential - 指定 AccessKeyID、计算签名的日期、区域和服务。它的格式是
<your-access-key-id>/<date>/<aws-region>/<aws-service>/aws4_request
,date
的格式是YYYYMMDD
。 - SignedHeaders - 指定用于计算签名的请求头列表,以分号分隔。仅包含请求头的名称,且必须是小写,例如:
host;range;x-amz-date
。 - Signature - 表示为 64 个小写十六进制字符的 256 位签名,例如:
fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024
。
总结
转载自:https://juejin.cn/post/6950300506946273294