【发布时间】:2015-02-19 13:02:31
【问题描述】:
我们正在尝试在 AWS 中创建一个完全加密的存储桶。
我们有一个密钥 key = "arn:aws:kms:*****"、一个 bucketName、bucketName = "MyUniqueBucket" 和一些我想上传和加密的 json:payload = { "foo": "bar" }
加密执行策略:
policy = {
"Version": "2012-10-17",
"Id": "PutObjPolicy",
"Statement": [{
"Sid": "DenyUnEncryptedObjectUploads",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": ("arn:aws:s3:::%s/*") % bucketName,
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption":"aws:kms"
}
}
}
]
}
现在我们使用boto 连接到eu-west-1:
def get_bucket():
conn = s3.connect_to_region("eu-west-1")
try:
return conn.get_bucket(bucketName)
except S3ResponseError:
return conn.create_bucket(bucketName, location=Location.EU)
我们现在要使用存储桶设置该策略:
bucket = get_bucket()
bucket.set_policy(json.dumps(policy))
接下来我想上传一个文件并使用我的安全密钥对其进行加密(以启用轮换,因为默认主密钥不允许这样做)。
headers = {
"x-amz-server-side-encryption-aws-kms-key-id": key,
"x-amz-server-side-encryption" : "aws:kms"
}
bucketKey = Key(bucket, "fileName.json")
bucketKey.set_metadata("Content-Type", "application/json")
bucketKey.set_contents_from_string(json.dumps(payload), headers = headers)
但是它会引发错误:
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
我检查过的内容:
我有权使用密钥 我与 v4 签名有关 我可以在不加密的情况下上传到存储桶中 我可以在没有我自己的自定义密钥的情况下使用为加密设置的标头上传(即使用默认密钥)(请注意,这会导致 MD5 与 ETAG 问题)。
但是我必须在传递密钥时做错了什么,因为它是否被禁用并不重要。它仍然给出签名错误
我缺少什么吗?
【问题讨论】:
-
这方面有什么更新吗?
标签: encryption amazon-s3 boto