认证鉴权
请求的认证鉴权通常是通过AK/SK对请求进行签名,在请求时将签名信息添加到消息头,从而通过身份认证,加密调用请求。
- AK(Access Key ID):访问密钥ID。与私有访问密钥关联的唯一标识符;访问密钥ID和私有访问密钥一起使用,对请求进行加密签名。
- SK(Secret Access Key):私有访问密钥。与访问密钥ID结合使用,对请求进行加密签名,可标识发送方,并防止请求被修改。
使用AK/SK认证时,您可以基于签名算法使用AK/SK对请求进行签名。
签名生成规则
signature形式
AWS {access-key}:{hash-of-secret-and-resource}
- access-key:填入真实的访问密钥ID;
- hash-of-secret-and-resource:通常是由请求uri、method、签名生成时间等和对应的secret key组合而成的字符串经hash(SHA1)再base64之后的结果;
注意:在 {access-key} 和 {hash-of-secret-and-resource} 之间有一个冒号【:
】。
签名生成步骤
生成签名通常需要以下这些步骤:
- 获取请求方法http Method,如 PUT;
- 获得GMT格式的签名生成时间DateValue,如
Mon, 06 May 2024 08:51:53 +0000
; - 获取请求完整uri,如 /testbucket/testobj;
- 将以上信息按指定格式拼接生成最终参与签名的完整字符串stringToSign=
${httpMethod}\n\n\n${DateValue}\n${uri}
,如PUT\n\n\nMon, 06 May 2024 08:51:53 +0000\n/testbucket/testobj
; - 将sk作为秘钥使用HmacSHA1对上述stringToSign进行hash;
- 对上述hash值进行base64编码得到hash-of-secret-and-resource值,如 w/dZLIS06uPsWX3vIRI+cruX0VM=;
- 按AWS {access-key}:{hash-of-secret-and-resource}进行拼接得到最终signature鉴权头
SHELL实例
以上传对象为例:
#!/bin/sh
ak="访问密钥ID,请从媒体存储控制台-密钥管理-密钥管理TAB获取"
sk="私有访问密钥,请从媒体存储控制台-密钥管理-密钥管理TAB获取"
endpoint="https://stor-api.xstore.ctyun.cn"
uri="/testbucket/testobj"
httpMethod="PUT"
DateValue="$(LC_TIME=C TZ=GMT date +'%a, %d %b %Y %H:%M:%S GMT')"
Source="localfile"
stringToSign="${httpMethod}\n\n\n${DateValue}\n${uri}"
signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${sk} -binary | base64`
Param="-L -i -v -X PUT -T ${Source}"
echo "curl ${Param} -H \"Date: ${DateValue}\" -H \"Authorization: AWS ${ak}:${signature}\" \"${endpoint}${uri}\""
sh -c "curl ${Param} -H 'Date: ${DateValue}' -H 'Authorization: AWS ${ak}:${signature}' '${endpoint}${uri}'"