2.3.2. S3 身份验证
对 Ceph 对象网关的请求可以是经过身份验证的用户或未经身份验证的请求。Ceph 对象网关假定匿名用户发送了未经身份验证的请求。Ceph 对象网关支持 ACL。
对于大多数用例,客户端使用现有开源库,如 Amazon SDK 的 AmazonS3Client
用于 Java 和 Python Boto。使用开源库,只需传递访问密钥和密钥,库会为您构建请求标头和身份验证签名。但是,您可以创建请求并签署它们。
在向 Ceph 对象网关服务器发送前,在请求中包括访问密钥和基于 64 编码的消息身份验证代码(HMAC)的要求。Ceph 对象网关使用兼容 S3 的身份验证方法。
示例
HTTP/1.1 PUT /buckets/bucket/object.mpeg Host: cname.domain.com Date: Mon, 2 Jan 2012 00:01:01 +0000 Content-Encoding: mpeg Content-Length: 9999999 Authorization: AWS ACCESS_KEY:HASH_OF_HEADER_AND_SECRET
在上例中,将 ACCESS_KEY
替换为 access key ID 的值,后跟一个冒号(:
)。将 HASH_OF_HEADER_AND_SECRET
替换为一个规范标头字符串的哈希值,以及与访问密钥 ID 对应的 secret。
生成标头字符串和 secret 的哈希值
生成标头字符串和 secret 的哈希值:
- 获取标头字符串的值。
- 将请求标头字符串规范化为规范形式。
- 使用 SHA-1 哈希算法生成 HMAC。
-
将
hmac
结果编码为 base-64。
规范化标头
将标头规范化为规范形式:
-
获取
所有内容
标头。 -
删除除
content-type
和content-md5
外的所有content-
标头。 -
确保
content-
标头名称是小写。 -
以字典顺序对
content-
标题排序。 -
确保带有
Date
标头,并确保指定的日期使用 GMT 而不是偏移量。 -
获取以
x-amz-
开头的所有标题。 -
确保
x-amz-
标头都是小写。 -
适当地对
x-amz-
headers 进行排序。 - 将同一字段名称的多个实例合并到一个字段中,并使用逗号分隔字段值。
- 使用单个空格替换标题值中的空格和换行符。
- 在冒号前后删除空格。
- 在每个标头后面添加一个新行。
- 将标头合并回请求标头。
将 HASH_OF_HEADER_AND_SECRET
替换为 base-64 编码的 HMAC 字符串。
其它资源
- 如需了解更多详细信息,请参阅 Amazon Simple Storage Service 文档中的签名和授权 REST Requests 部分。