【发布时间】:2015-03-16 16:18:36
【问题描述】:
我正在尝试使用带有 AWS 签名版本 4 的 POST 创建客户端上传。 根据文件
当我在服务器端生成签名时,我得到与 this example page. 中提到的 AWS 签名完全匹配
但是,当我使用它上传页面时,我收到此错误:
SignatureDoesNotMatch我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法
这是我使用的代码:
OpenSSL::HMAC.hexdigest('sha256', signing_key(string_to_sign), string_to_sign)
# step 2 in the aws documentation
def signing_key(encoded_policy)
# generate the correct date
date = extract_encoded_policy_date(encoded_policy)
date = time_adjust(date)
# encode all the fields by the algorithm
date_key = OpenSSL::HMAC.digest('sha256',"AWS4#{@secret_access_key}", date.strftime("%Y%m%d"))
date_region_key = OpenSSL::HMAC.digest('sha256',date_key, @region)
date_region_service_key = OpenSSL::HMAC.digest('sha256',date_region_key, @service)
signing_key = OpenSSL::HMAC.digest('sha256',date_region_service_key, 'aws4_request')
signing_key
end
def time_adjust(date)
time = Time.parse(date)
time += time.utc_offset
time.utc
end
在网上搜索了一下,我遇到了这个article。我已经实现了这段代码,上传成功了。
signature = OpenSSL::HMAC.digest( OpenSSL::Digest::Digest.new('sha1'), @secret_access_key, string_to_sign)
Base64.encode64(signature).gsub("\n","")```
这是客户端代码的小Demo。
这里有一些我发现有用的文献:
General description
Some code snippets from AWS
两者有什么区别?
如何获得第一个选项来工作和上传我的文件?
AWS 页面中的示例是否不再有效?
【问题讨论】:
-
您似乎正在多次签署数据。您需要做的就是编译字符串并签名一次。
-
正如您在docs.aws.amazon.com/AmazonS3/latest/API/… 中看到的,AWS4 授权需要一系列编码。第二个代码部分是一个不同的尝试,而不是第一个。
标签: ruby amazon-web-services amazon-s3