使用POST请求向S3上传对象时,如何解决SSE-C密钥哈希不匹配问题?
解决SSE-C预签名POST URL上传的MD5哈希不匹配问题
核心问题分析
你遇到的哈希不匹配错误,大概率是因为错误计算了SSE-C要求的密钥MD5值的Base64编码。AWS SSE-C要求的是原始密钥的MD5二进制哈希值的Base64编码,而不是MD5十六进制字符串的Base64编码——你当前使用的MjJiNzVkNjAwN2UwNmY0YTk1OWQxYjFkNjliNGM0YmQ=是把MD5的十六进制字符串(22b75d6007e06f4a959d1b1d69b4c4bd)转成了Base64,这不符合AWS的校验规则。
正确计算SSE-C所需的MD5 Base64值
用命令行工具直接计算原始密钥的MD5二进制哈希并转Base64,结果才是正确的:
# 计算密钥TEST123的MD5二进制哈希,再转Base64 echo -n "TEST123" | openssl md5 -binary | base64
执行后得到的正确值是:K7gNU3sdo+OL0wNhqoVWhr3g6s4=
上传请求的正确参数配置
上传时必须在请求头中包含以下三个SSE-C相关字段,且值必须与预签名URL生成时的参数一致:
x-amz-server-side-encryption-customer-algorithm: AES256x-amz-server-side-encryption-customer-key: VEVTVDEyMw==(你的原始密钥Base64编码,这个是正确的)x-amz-server-side-encryption-customer-key-MD5: K7gNU3sdo+OL0wNhqoVWhr3g6s4=(上面计算出的正确值)
预签名POST URL生成的关键检查
确保生成预签名POST表单时,已经将SSE-C相关参数包含在签名范围内:
- 表单字段中必须包含
x-amz-server-side-encryption-customer-algorithm=AES256 - 生成签名时,必须将该字段以及后续上传要用到的SSE-C请求头纳入签名计算逻辑
- 预签名的有效期、桶名、对象键等其他参数无错误
验证步骤
- 用上述命令行工具重新计算MD5的Base64值,替换你当前使用的错误值
- 检查上传请求的三个SSE-C头是否完全符合要求
- 确认预签名POST生成时,已正确包含SSE-C的算法参数并完成签名
内容的提问来源于stack exchange,提问作者Anush
相关产品推荐
相关产品推荐

