You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

S3预签名URL使用PUT请求携带Content-MD5始终失败

解决S3预签名URL PUT请求的InvalidDigest错误

你的问题核心是Content-MD5生成方式不符合AWS要求:AWS需要的是文件内容MD5哈希值的二进制形式做Base64编码,而你错误地把MD5的十六进制字符串直接做了Base64编码。另外echo命令默认会添加换行符,导致编码结果额外包含换行字节,进一步触发验证失败。

正确生成Content-MD5的命令

直接用以下两种方式之一生成符合要求的值:

# 方法1:一步生成文件的二进制MD5并转Base64
openssl md5 -binary hurl/push-document/lorem.txt | base64

# 方法2:从md5sum的十六进制结果转换为二进制再编码
md5sum hurl/push-document/lorem.txt | awk '{print $1}' | xxd -r -p | base64
  • openssl md5 -binary:直接输出文件MD5的二进制字节流
  • xxd -r -p:将十六进制字符串还原为原始二进制字节流
  • 最后通过base64编码得到AWS认可的Content-MD5格式

修正后的PUT请求示例

把上面生成的正确值替换到请求头中,再发起请求:

curl --request PUT \
  --header 'Content-MD5: 替换为正确的Base64编码值' \
  --header 'Content-Type:' \
  --data-binary '@hurl/push-document/lorem.txt' \
  'http://localstack.localhost:8000/espaidoc/f58e63f2-a075-46f2-b4fa-5e5d72776d1e?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20240304T063920Z&X-Amz-SignedHeaders=content-md5%3Bhost&X-Amz-Expires=60&X-Amz-Credential=test%2F20240304%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=3ff0685e9f670562bcd241d5d1882ebbb49adbae9fd4110e45c65541ec35c1e7'

额外注意

  1. 你的预签名URL已经包含content-md5在X-Amz-SignedHeaders中,这部分配置是正确的
  2. 请求时的Content-MD5必须和文件内容完全匹配,且与生成预签名URL时的约定一致

内容的提问来源于stack exchange,提问作者Jordi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 15:22:57