使用Boto3上传文件至S3 Bucket时SHA256校验失败求助
解决S3 PutObject时x-amz-checksum-sha256头无效的问题
你的校验和计算逻辑存在两处关键错误,导致生成的值不符合S3的格式要求:
- 错误使用
hexdigest()而非digest():hexdigest()返回的是哈希值的十六进制字符串表示,而S3要求的是原始二进制哈希值的base64编码。你把十六进制字符串转成bytes再做base64编码,相当于对字符串的字节编码做二次转换,完全偏离了正确的哈希值。 - 错误用
str()包裹base64结果:b64encode()返回的是bytes对象,直接转成str会保留b'...'的字节标识格式,这会被S3判定为无效的校验和值。
修正后的校验和计算函数
import hashlib from base64 import b64encode def checksum_sha256(filename): """ Calculates SHA256 Checksum for specified filename """ sha256_hash = hashlib.sha256() with open(filename, "rb") as f: for byte_block in iter(lambda: f.read(8192), b""): sha256_hash.update(byte_block) # 直接获取原始二进制哈希值,base64编码后转为纯字符串 return b64encode(sha256_hash.digest()).decode("utf-8")
验证方法
你可以用本地命令计算正确的校验和来对比:
# 用openssl计算文件的SHA256 base64校验和 openssl dgst -sha256 -binary 你的文件名 | base64
该结果应与修正后函数的返回值完全一致,此时再执行原上传代码即可正常通过S3的校验。
内容的提问来源于stack exchange,提问作者GothamCity
相关产品推荐
相关产品推荐

