带有 S3 putObject 预签名的无效签名 url
Invalid signature with S3 putObject presigned url
我正在使用 lambda 函数创建预签名 url 以上传到 S3:
var crypto = require('crypto');
var AWS = require('aws-sdk');
AWS.config.region = 'eu-west-1';
function randomValueHex (len) {
return crypto.randomBytes(Math.ceil(len/2))
.toString('hex') // convert to hexadecimal format
.slice(0,len); // return required number of characters
}
var value1 = randomValueHex(12)
exports.handler = function(event, context) {
var key = randomValueHex(16);
// Url is
var s3 = new AWS.S3();
var params = {Bucket: 'somebucket', Key: key };
var url = s3.getSignedUrl('putObject', params);
context.succeed({ key: key, url: url });
}
然后 url 我尝试用 httpie 进行 PUT 调用:
echo "something" | http -v PUT https://...presigned url
但是我得到:
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
lambda 以完整的 s3 访问执行角色运行,但权限不应该是这里的问题
更新:尝试上传没有 content-type header 的文件工作正常:
http -v PUT https://...url
看来问题出在内容类型上,但由于我没有指定它,所以我认为如果我上传 json 或其他任何内容,AWS 也不会介意
至少在签名版本 2 中,来自 Content-Type
header 的值是签名算法的组成部分...所以如果 getSignedUrl
不知道什么你要放在那里,它会生成一个无效的签名。
您应该可以将其添加到 params
中的 key/value 对中:
ContentType, 'text/plain' // using the appropriate mine type string
我正在使用 lambda 函数创建预签名 url 以上传到 S3:
var crypto = require('crypto');
var AWS = require('aws-sdk');
AWS.config.region = 'eu-west-1';
function randomValueHex (len) {
return crypto.randomBytes(Math.ceil(len/2))
.toString('hex') // convert to hexadecimal format
.slice(0,len); // return required number of characters
}
var value1 = randomValueHex(12)
exports.handler = function(event, context) {
var key = randomValueHex(16);
// Url is
var s3 = new AWS.S3();
var params = {Bucket: 'somebucket', Key: key };
var url = s3.getSignedUrl('putObject', params);
context.succeed({ key: key, url: url });
}
然后 url 我尝试用 httpie 进行 PUT 调用:
echo "something" | http -v PUT https://...presigned url
但是我得到:
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
lambda 以完整的 s3 访问执行角色运行,但权限不应该是这里的问题
更新:尝试上传没有 content-type header 的文件工作正常:
http -v PUT https://...url
看来问题出在内容类型上,但由于我没有指定它,所以我认为如果我上传 json 或其他任何内容,AWS 也不会介意
至少在签名版本 2 中,来自 Content-Type
header 的值是签名算法的组成部分...所以如果 getSignedUrl
不知道什么你要放在那里,它会生成一个无效的签名。
您应该可以将其添加到 params
中的 key/value 对中:
ContentType, 'text/plain' // using the appropriate mine type string