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

Amazon S3请求签名不匹配,Android项目调用Get Object功能异常

问题排查与解决方案

由于你的上传功能可正常运行,说明AWS密钥本身有效,且签名核心逻辑没有问题,故障一定来自Android运行环境和桌面Java环境的差异,可按以下优先级排查:

  • 优先检查Android设备时间同步状态
    AWS SigV4签名要求请求时间和UTC标准时间误差不超过15分钟,桌面端Java运行时通常默认开启网络时间同步,而Android设备可能存在手动修改时间、未开启网络时间同步的情况,直接导致生成的x-amz-date头不符合要求,签名校验失败。你可以先开启设备的「自动同步网络时间」选项测试,也可以在代码中强制使用NTP服务获取标准UTC时间生成签名头,不要直接调用系统本地时间接口。
  • 对比双环境下的规范请求字符串差异
    将Android端生成的完整规范请求字符串、待签名字符串和桌面Java正常运行时的输出逐字符对比,重点注意两个差异点:
    1. 路径编码:Android默认的Uri编码逻辑和Java SE的URLEncoder实现存在差异,可能将路径中的/意外编码为%2F,或是对特殊字符的编码不符合AWS SigV4要求的RFC 3986规范
    2. 换行符:规范请求要求每一行末尾必须使用\n作为分隔符,Android部分字符串处理工具可能自动替换为\r\n,直接导致签名计算错误
  • 排查HTTP客户端自动添加的额外请求头
    Android常用的HTTP客户端(如OkHttp、HttpURLConnection)会默认自动添加Connection、Accept-Encoding、User-Agent等请求头,你生成签名时仅将host、x-amz-content-sha256、x-amz-date加入了签名头列表,如果实际发请求时多了其他请求头,AWS服务端校验时会将所有收到的请求头纳入计算,直接导致签名不匹配。你可以通过抓包查看实际发出的请求头列表,要么将所有额外头加入签名头列表,要么配置HTTP客户端禁止自动添加未签名的请求头。
  • 确认SecretKey的字符编码
    部分Android系统的默认字符集不是UTF-8,生成签名派生密钥时如果没有指定UTF-8编码,会导致密钥计算错误,你可以在所有涉及字符串转字节数组的地方强制指定StandardCharsets.UTF_8,避免依赖系统默认字符集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:45:02