概述
用户可以使用查询字符串参数验证身份信息,此方法也称为预签名URL。预签名URL的用例场景是用户可以授予对OOS资源的临时访问权限。例如,用户可以在网站上包含预先签名的URL,或者在命令行客户端(例如Curl)中使用它来下载文件。
预签名URL支持GET、DELETE、PUT、HEAD、POST请求(POST Object除外)。
注意使用预签名URL方式,有将您授权的数据在过期时间内曝露在互联网上的风险,建议您预先评估后使用。
以下是预签名URL的示例。
https://oos-cn.ctyunapi.cn/examplebucket/test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=<AccessKeyID>/20180721/<oos-region>/s3/aws4_request
&X-Amz-Date=20180721T201207Z
&X-Amz-Expires=86400
&X-Amz-SignedHeaders=host
&X-Amz-Signature=<signature-value>
预签名URL方式需要注意:
- 预签名URL方式必须包含的字段:X-Amz-Date、X-Amz-Algorithm、X-Amz-Signature、X-Amz-SignedHeaders、X-Amz-Credential和X-Amz-Expires。字段的顺序可以互换,如果缺少其中一个,返回错误信息。
- 如果访问时间晚于请求中X- Amz-Expires时间或者设置的时间格式错误,返回错误信息。
- 如果在URL和Header中同时包含签名,以Header中的签名为准。
- 该X-Amz-CredentialURL中的值仅显示可读性“/”字符。在实践中,它应编码为%2F。例如:
&X-Amz-Credential=<AccessKeyID>%2F20180721%2F<oos-region>%2Fs3%2Faws4_request
下表介绍了URL中提供身份验证信息的查询参数。
查询字符串参数 描述 X-Amz-Algorithm 确定OOS签名的版本以及用于计算签名的算法。取值为AWS4-HMAC-SHA256。 X-Amz-Credential 用户的accessKeyId和范围信息,范围信息包括请求日期、区域、服务、终止字符串aws4_request,格式如下:
AccessKeyID/date/region/service/aws4_request 其中:
date格式为YYYYMMDD。
region:
对于oos api:访问域名为oos-xx.ctyunapi.cn,region为xx。
对于统计api:访问域名为oos-xx-mg.ctyunapi.cn,region为xx-mg。
对于操作跟踪api:访问域名为oos-xx-cloudtrail.ctyunapi.cn,region为xx。
对于iam api:访问域名为oos-xx-iam.ctyunapi.cn,region为xx。各资源池的详细访问域名详见域名(Endpoint)列表。
service:
若使用OOS API服务,service为s3。
若使用统计分析服务,service为s3。
若使用操作跟踪服务,service为cloudtrail。若使用IAM服务,service为sts。X-Amz-Date 日期和时间格式必须遵循ISO 8601标准,并且必须使用“yyyyMMddTHHmmssZ”格式进行格式化。例如,如果日期和时间是“08/01/2018 15:32:41.982-700”,则必须首先将其转换为UTC(协调世界时),然后提交为“20180801T083241Z”。 X-Amz-Expires 提供生成的预签名URL有效的时间段(以秒为单位)。例如,86400(24小时)。该值是整数。您可以设置的最小值为1,最大值为604800(七天)。 X-Amz-SignedHeaders 列出用于计算签名的标头。签名计算中需要以下标头:
HTTP host标头。
x-amz-*请求头。
X-Amz-Signature 提供签名以验证您的请求。此签名必须与OOS计算的签名相匹配。否则,OOS拒绝该请求。
签名过程
下图说明了签名计算过程。
下表描述了图中显示的功能。用户需要为这些功能实现代码。
功能 描述 Lowercase() 将字符串转换为小写。 Hex() 小写十六进制编码。 SHA256Hash() 安全散列算法(SHA)加密散列函数。 HMAC-SHA256() 使用提供的签名密钥的SHA256算法计算HMAC。这是最终的签名。 Trim() 删除任何前导或尾随空格。 UriEncode() URI编码每个字节。UriEncode()必须强制执行以下规则:
URI编码除了下面字符之外的每个字节:'A' - 'Z','a' - 'z','0' - '9',' - ','.','_'和'〜'。
空格字符是保留字符,必须编码为“%20”(而不是“+”)。
每个URI编码字节由'%'和两位十六进制值组成。
十六进制值中的字母必须为大写,例如“%1A”。
除了文件名之外,对正斜杠字符'/'进行编码。例如,如果文件名称为photos/Jan/sample.jpg,则不对键名称中的正斜杠进行编码。
说明建议您编写自己的自定义UriEncode函数,以确保您的编码可以正常工作。
以下是Java中的示例UriEncode()函数。
public static String UriEncode(CharSequence input, boolean encodeSlash) {
StringBuilder result = new StringBuilder();
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') {
result.append(ch);
} else if (ch == '/') {
result.append(encodeSlash ? "%2F" : ch);
} else {
result.append(toHexUTF8(ch));
}
}
return result.toString();
}
使用参数的签名过程与使用请求头的签名过程类似,如下所示:
- 由于创建预签名URL的时候,并不知道有效负载的内容,所以设置常量UNSIGNED-PAYLOAD。
- 规范查询字符串(Canonical Query String)必须包括除了X-Amz-Signature之外的所有上述查询字符串。
规范标头必须包括HTTP Host标头。如果用户想包含x-amz-*请求头,这些标头都将参与签名计算。用户可以选择其他的请求头是否参与签名计算。安全起见,尽可能多的请求头参与签名计算。
生成签名的示例
通过创建预签名URL的方式,与其他人共享example-bucket中test.txt文件,过期时间设置为7天(604800秒)。以GET请求为例:
GET
http://oos-cn.ctyunapi.cn/example-bucket/test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=2a948fd3f00ba0925806/20240906/cn/s3/aws4_request&X-Amz-Date=20240906T235141Z&X-Amz-Expires=604800
&X-Amz-SignedHeaders=host
&X-Amz-Signature=<signature-value>
以下步骤首先说明如何计算签名和构建预签名URL。示例中使用的访问密钥如下:
参数 | 值 |
---|---|
AccessKeyID | 2a948fd3f00ba0925806 |
SecretAccessKey | ef2017c2e5ffa0b1761717ecbca021da16501384 |
- StringToSign
- 创建规范请求(以GET请求为例)
GET /example-bucket/test.txt X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=2a948fd3f00ba0925806%2F20240906%2Fcn%2Fs3%2Faws4_request&X-Amz-Date=20240906T235141Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host host:oos-cn.ctyunapi.cn host UNSIGNED-PAYLOAD
- 待签名字符串
AWS4-HMAC-SHA256 20240906T235141Z 20240906/cn/s3/aws4_request 9e0b6407d893f03ea8ed79710b98a0b19bf9060b744f0e14212f32d1ac04ba62
- 创建规范请求(以GET请求为例)
- StringKey
signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<SecretAccessKey>","20240906"),"cn"),"s3"),"aws4_request")
- 签名
66628b60cb4cc78d37c76b204d6a019572ed3887d84488c72f0643d850ad4915
- 将签名信息添加到请求头
http://oos-cn.ctyunapi.cn/example-bucket/test.txt?X-Amz-Date=20240906T235141Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Signature=66628b60cb4cc78d37c76b204d6a019572ed3887d84488c72f0643d850ad4915&X-Amz-SignedHeaders=host&X-Amz-Credential=2a948fd3f00ba0925806/20240906/cn/s3/aws4_request&X-Amz-Expires=604800