Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python boto3客户端错误:使用客户提供的密钥的服务器端加密与指定的加密方法不兼容_Python_Django_Encryption_Amazon S3_Boto3 - Fatal编程技术网

Python boto3客户端错误:使用客户提供的密钥的服务器端加密与指定的加密方法不兼容

Python boto3客户端错误:使用客户提供的密钥的服务器端加密与指定的加密方法不兼容,python,django,encryption,amazon-s3,boto3,Python,Django,Encryption,Amazon S3,Boto3,我在django应用程序中使用boto3将一些文件上传到S3。但是,当我尝试使用指定客户端加密算法和密钥时,收到以下错误 调用PutObject时发生错误(InvalidArgument) 操作:使用客户提供的密钥进行服务器端加密 与指定的加密方法不兼容 这是我指定加密算法和密钥的代码 import boto3 s3 = boto3.resource('s3') key = s3.Object(bucket_name, key_name) file_obj.see

我在django应用程序中使用boto3将一些文件上传到S3。但是,当我尝试使用指定客户端加密算法和密钥时,收到以下错误

调用PutObject时发生错误(InvalidArgument) 操作:使用客户提供的密钥进行服务器端加密 与指定的加密方法不兼容

这是我指定加密算法和密钥的代码

    import boto3
    s3 = boto3.resource('s3')
    key = s3.Object(bucket_name, key_name)
    file_obj.seek(0)
    kwargs = {
        'ServerSideEncryption': 'AES256',
        'SSECustomerAlgorithm': 'AES256',
        'SSECustomerKey': settings.AWS_ENCRYPTION_KEY,
    }

    key.put(**kwargs)
    key.put(Body=file_obj)
    key.Acl().put(ACL='public-read')
下面是如何在settings.py中生成加密密钥

# settings.py
password = '32characterslongpassphraseneeded'.encode('utf-8')
AWS_ENCRYPTION_KEY = base64.b64encode(password)
更新
我正在使用python3。

在boto3库上发布了一个问题后,我终于得到了一个工作示例。以下是应该如何做到这一点

import boto3
import os

BUCKET = 'YOUR-BUCKET'
KEY = os.urandom(32)
s3 = boto3.client('s3')
print("Put object...")
s3.put_object(Bucket=BUCKET,
              Key='path_of_object_in_bucket', Body=b'foobar',
              SSECustomerKey=KEY,
              SSECustomerAlgorithm='AES256')
print("Done")
# Make sure to save the KEY!

# Getting the object:
print("Getting object...")
response = s3.get_object(Bucket=BUCKET,
                         Key='path_of_object_in_bucket',
                         SSECustomerKey=KEY,
                         SSECustomerAlgorithm='AES256')
print("Done, response body:")
print(response['Body'].read())

在boto3库上发布了一个问题后,我终于得到了一个工作示例。以下是应该如何做到这一点

import boto3
import os

BUCKET = 'YOUR-BUCKET'
KEY = os.urandom(32)
s3 = boto3.client('s3')
print("Put object...")
s3.put_object(Bucket=BUCKET,
              Key='path_of_object_in_bucket', Body=b'foobar',
              SSECustomerKey=KEY,
              SSECustomerAlgorithm='AES256')
print("Done")
# Make sure to save the KEY!

# Getting the object:
print("Getting object...")
response = s3.get_object(Bucket=BUCKET,
                         Key='path_of_object_in_bucket',
                         SSECustomerKey=KEY,
                         SSECustomerAlgorithm='AES256')
print("Done, response body:")
print(response['Body'].read())

我放弃了。似乎所有的工作示例都使用java/nodejs。网络中的其他样本似乎不起作用。我认为你应该在boto3 github中打开一个问题botocore中可能有未知的bug。我确实打开并发布了一个问题,一天前它要求提供一个工作示例。投稿人仍然没有回应@mootmoot最终得到了贡献者的响应。现在有一个有效的例子,我放弃了。似乎所有的工作示例都使用java/nodejs。网络中的其他样本似乎不起作用。我认为你应该在boto3 github中打开一个问题botocore中可能有未知的bug。我确实打开并发布了一个问题,一天前它要求提供一个工作示例。投稿人仍然没有回应@mootmoot最终得到了贡献者的响应。现在有一个工作示例。这是32字节的原始二进制,绝对不是AWS文档中所述的base64编码密钥。虽然boto3文档中没有提到base64编码的要求。这是32字节的原始二进制文件,绝对不是AWS文档中所述的base64编码密钥。尽管boto3文档中未提及base64编码的要求。