S3对象存储AWS4签名分析与实现

1. 前言


在用sdk跟rgw交互的时候,比如python下常用的boto3和boto或者s3cmd 工具,时常会遇到如下的问题

SignatureDoesNotMatch

直译过来就是 签名不匹配,所以到底这个签名是什么,他是怎么个签名的过程?

2. AWS 签名的种类


我们知道S3对象存储服务是由亚马逊发扬光大的,亚马逊也定义S3的整个标准,比如ceph 的rgw,minio的s3服务都是按照亚马逊的标准来开发的,所以,如果你想找关于S3标准的文档比如签名文档,API接口文档,那么你直接去AWS官网一定可以找到最完整的文档(划重点),需要注意的事,AWS s3拥有的特性,ceph rgw是不一定有,这个还需要参考ceph官网。

3. AWS 4签名过程


首先来看一个S3 获取对象的GET OBJECT 接口的http 请求,这是一个可以正常获取对象的请求

GET /data_bucket/usysysysysys HTTP/1.1
Host: 172.26.2.41:8000
User-Agent: Go-http-client/1.1
Authorization: AWS4-HMAC-SHA256 Credential=admin/20190830/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=ab33ca157e8e962b5bc9186fc7b30bba257d56128c603f28d4259fa71989a2fe
X-Amz-Content-Sha256: UNSIGNED-PAYLOAD
X-Amz-Date: 20190830T085636Z
Accept-Encoding: gzip

这里需要特别注意的是,AWS 的每一个API接口对header的要求是不一样,这里header简单分为三种

当然这些是对应的API开发问题,我们先专注与签名这一块,签名是一个公共模块,对所有的接口都是一样的

AWS 的签名过程,无非是对,http header 、http body 和用户的秘钥, 按照一定的规则进行哈希,得到惟一值 signature ,服务端校验的过程,并不是一般意义上的解密过程,而是服务器对http的内容进行再一次的计算,如果计算的结果跟客户端计算的签名是一样的,则表明请求合法,总体的过程如下

image

aws4 的签名过程在官方文档中有非常详细的说明,所以我这里不会很具体的分析每一步,但是会将遇到的需要特别注意的点提取出来,少踩坑。

首先还是看一张整体的签名思维导图 (图片太小右键其他标签页打开)

image

4. 参考文档