AWS SDK for Java 1.x 403问题解决方法和原因
问题表现
使用AWS SDK for Java 1.x访问S3,已经确认文件存在,且具有权限,仍然出现403 Forbidden应答。
解决方法
升级到AWS SDK for Java 2.x。
问题原因
AWS签名机制严格依赖请求的精确路径格式,任何URI的差异(如 // 与 /%2F )都会导致签名校验失败。AWS SDK for Java 1.x版本中,当资源路径 resourcePath 以斜杠开头时(如 /foo/... ),与 endpoint 拼接后会产生双斜杠 // 。SDK内部会将其转义为 /%2F ,导致实际请求路径与签名计算的路径不一致,触发 SignatureDoesNotMatch 错误。
关键代码分析
在AWS SDK for Java 1.x版本中,当调用 httpRequestFactory.create(request, options) 方法时,URL的生成过程涉及路径拼接逻辑与双斜杠转义机制,具体流程如下:
@Overridepublic HttpRequestBase create(final Request<?> request,final HttpClientSettings settings)throwsFakeIOException {URI endpoint = request.getEndpoint();String uri;// skipAppendUriPath is set for APIs making requests with presigned urls. Otherwise// a slash will be appended at the end and the request will failif (request.getOriginalRequest().getRequestClientOptions().isSkipAppendUriPath()) {uri = endpoint.toString();} else {/** HttpClient cannot handle url in pattern of "http://host//path", so we* have to escape the double-slash between endpoint and resource-path* into "/%2F"*/uri = SdkHttpUtils.appendUri(endpoint.toString(), request.getResourcePath(), true);}String encodedParams = SdkHttpUtils.encodeParameters(request);/** For all non-POST requests, and any POST requests that already have a* payload, we put the encoded params directly in the URI, otherwise,* we'll put them in the POST request's payload.*/boolean requestHasNoPayload = request.getContent() != null;boolean requestIsPost = request.getHttpMethod() == HttpMethodName.POST;boolean putParamsInUri = !requestIsPost || requestHasNoPayload;if (encodedParams != null && putParamsInUri) {uri += "?" + encodedParams;}final HttpRequestBase base = createApacheRequest(request, uri, encodedParams);addHeadersToRequest(base, request);addRequestConfig(base, request, settings);return base;}
假设原始请求参数为
Endpoint: http://127.0.0.1/mybucket
ResourcePath: /foo/bar/... (以斜杠开头)
SdkHttpUtils.appendUri() 将 endpoint 与 resourcePath 拼接为:
http://127.0.0.1/mybucket//foo/bar/...
注意中间的 // 双斜杠。由于第三个参数 escapeDoubleSlash=true ,SDK会将双斜杠转义为 /%2F :
http://172.24.152.73:80/mybucket/%2Ffoo/bar/...
生成的URI变为转义后的路径,而计算签名时使用的路径是未经转义的原始路径 /mybucket//foo/bar/... ,导致签名不匹配。
相关文章:
AWS SDK for Java 1.x 403问题解决方法和原因
问题表现 使用AWS SDK for Java 1.x访问S3,已经确认文件存在,且具有权限,仍然出现403 Forbidden应答。 解决方法 升级到AWS SDK for Java 2.x。 问题原因 AWS签名机制严格依赖请求的精确路径格式,任何URI的差异(如…...
Vue进阶之Vue2源码解析
Vue2源码解析 源码解析目录解析package.json入口查找入口文件确定vue入口this.\_init_ 方法$mount 挂载方法Vue.prototype._renderVue.prototype._updateVue.prototype._patch vue2 vue3 源码解析 目录解析 vue2.6之后的版本都做的是兼容Vue3的内容,2.6版本前的内…...
unity lua属性绑定刷新
我们现在有一个 角色属性类叫heroModel,内容如下,当heroModel中的等级发生变化的时候,我们需要刷新界面显示等级信息,通常我们是在收到等级升级成功的协议的时候,发送一个事件,UI界面接受到这个事件的时候,刷新一下等级…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_conf_t
ngx_conf_t 定义在src/core/ngx_core.h typedef struct ngx_conf_s ngx_conf_t;ngx_conf_s 定义在 src/core/ngx_conf_file.h struct ngx_conf_s {char *name;ngx_array_t *args;ngx_cycle_t *cycle;ngx_pool_t *po…...
gtest 和 gmock讲解
Google Test(gtest)和 Google Mock(gmock)是 Google 开发的用于 C 的测试框架和模拟框架,以下是对它们的详细讲解: Google Test(gtest) 简介 Google Test 是一个用于 C 的单元测试框…...
Ubuntu20.04安装Redis
目录 切换到root用户 使用 apt install redis 安装redis 修改配置文件 编辑 重新启动服务器 使用Redis客户端连接服务器 切换到root用户 如果没有切换到root用户的,切换到root用户。 使用 apt install redis 安装redis 遇到y/n直接y即可。 redis安装好之…...
利用 DeepSeek 总结运维知识库的总结报告
一、背景 在运维工作中,知识库是重要的知识沉淀与共享工具。随着公司业务的发展,运维涉及的系统、设备和技术日益复杂,原有的运维知识库内容繁杂、缺乏条理,难以高效检索和利用。为了提升知识库的可用性,我尝试借助 D…...
Go基于协程池的延迟任务调度器
原理 通过用一个goroutine以及堆来存储要待调度的延迟任务,当达到调度时间后,将其添加到协程池中去执行。 主要是使用了chan、Mutex、atomic及ants协程池来实现。 用途 主要是用于高并发及大量定时任务要处理的情况,如果使用Go协程来实现每…...
一个原教旨的多路径 TCP
前面提到过 ECMP 和 TCP 之间的互不友好,pacing 收益和中断开销的互斥,在事实上阻碍了 packet-based LB 的部署,也限制了交换机,服务器的并发性能,同时潜在增加了 bufferbloat 的概率,而适用 packet-based …...
OSPF BIT 类型说明
注:本文为 “OSPF BIT 类型 | LSA 类型 ” 相关文章合辑。 机翻,未校。 15 OSPF BIT Types Explained 15 种 OSPF BIT 类型说明 Rashmi Bhardwaj Distribution of routing information within a single autonomous system in larger networks is per…...
如何获取mac os 安装盘
发现虚拟机VirtualBox支持Mac虚拟,就想尝试一下。但是发现Mac的安装盘特别难拿到,因此留档。 第一种方法 在mac环境下,使用softwareupdate命令来获取mac安装,能获得当前设备支持的系统。 使用这个命令:/usr/sbin/soft…...
【深度学习】强化学习(RL)-A3C(Asynchronous Advantage Actor-Critic)
A3C(Asynchronous Advantage Actor-Critic)详解 A3C(Asynchronous Advantage Actor-Critic) 是 深度强化学习(Deep Reinforcement Learning, DRL) 领域的重要算法,由 DeepMind 在 2016 年提出。…...
vue的双向绑定是怎么实现的
Vue.js 的双向绑定是通过 数据劫持(Data Observation) 和 发布-订阅模式(Publish-Subscribe Pattern) 实现的。具体来说,Vue 使用了以下核心技术: 数据劫持:通过 Object.defineProperty 或 Prox…...
在 Mac mini M2 上本地部署 DeepSeek-R1:14B:使用 Ollama 和 Chatbox 的完整指南
随着人工智能技术的飞速发展,本地部署大型语言模型(LLM)已成为许多技术爱好者的热门选择。本地部署不仅能够保护隐私,还能提供更灵活的使用体验。本文将详细介绍如何在 Mac mini M2(24GB 内存)上部署 DeepS…...
docker-compose部署onlyoffice8.3.0并支持ssl,且支持通过nginx代理,关闭JWT配置
编写docker-compose文件 mkdir -p /data/onlyoffice && echo "version: 3services:onlyoffice:container_name: OnlyOfficeimage: onlyoffice/documentserver:8.3.0restart: alwaysports:- 8088:80- 64431:443environment:TZ: Asia/ShanghaiJWT_ENABLED: falsevol…...
如何配置虚拟机的IP上网
要配置虚拟机的IP地址以便上网,你可以按照以下步骤操作: 打开虚拟机软件,确保虚拟机的网络设置为“桥接模式”或“NAT模式”,这样虚拟机可以与物理网络连接。 在虚拟机操作系统中,打开网络设置界面,一般在…...
【tplink】校园网接路由器如何单独登录自己的账号,wan-lan和lan-lan区别
老式路由器TPLINK,接入校园网后一人登录,所有人都能通过连接此路由器上网,无法解决遂上网搜索,无果,幸而偶然看到一个帖子说要把信号源网线接入路由器lan口,开启新世界。 一、wan-lan,lan-lan区…...
Python--内置模块和开发规范(下)
2. 开发规范 2.1 单文件应用 文件结构示例 # 文件注释 import os import jsonDB_PATH "data.json" # 常量放顶部def load_data():"""函数注释:加载数据"""if os.path.exists(DB_PATH):with open(DB_PATH, "r"…...
DeepSeek开源周Day5压轴登场:3FS与Smallpond,能否终结AI数据瓶颈之争?
2025年2月28日,DeepSeek开源周迎来了第五天,也是本次活动的收官之日。自2月24日启动以来,DeepSeek团队以每天一个开源项目的节奏,陆续向全球开发者展示了他们在人工智能基础设施领域的最新成果。今天,他们发布了Fire-F…...
[密码学实战]Java实现SM2数字信封(结合SM4对称加密)生成与解析
一、代码运行结果 二、什么是数字信封 2.1 基本概念 数字信封(Digital Envelope) 是一种结合对称加密与非对称加密的混合加密技术,通过以下步骤实现高效安全的数据传输: 对称加密:使用SM4算法加密原始数据,处理速度快,适合大数据量。非对称加密:使用SM2公钥加密SM4密…...
redis序列化设置
redis序列化设置 redis序列化设置序列化对象里有org.joda.time.DateTime1)、报错内容如下2)、解决方案:分别自定义时间的序列化和反序列化,以对象形式关联到redisTemplate redis序列化设置 redis序列化设置,通过自定义…...
Sqlserver安全篇之_TLS的证书概念
证书的理解 参考Sqlserver的官方文档https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/certificate-overview?viewsql-server-ver16 TLS(Transport Layer Security)传输层安全和SSL(Secure Sockets Layer)安全套接字层协议位于应用程序协议层和TCP/…...
【HarmonyOS Next】 鸿蒙应用useNormalizedOHMUrl详解
【HarmonyOS Next】 鸿蒙应用useNormalizedOHMUrl详解 一、useNormalizedOHMUrl是什么? useNormalizedOHMUrl指的是是否使用标准化OHMUrl拼接。 在开发过程中,需要根据不同的环境或配置动态生成 URL。例如,在加载一些远程模块或者资源时,…...
Oracle 查询表空间使用情况及收缩数据文件
本文介绍Oracle收缩数据文件的相关操作,运维工作中有时会需要通过收缩数据文件来释放磁盘空间。 数据文件初始化方式: 1.我们创建表空间一般有两种方式初始化其数据文件,即指定初始大小为32G(很大的值)或指定初始大小为…...
怎么进行mysql的优化?
MySQL 的优化是一个系统性的工作,涉及多个层面,包括查询优化、索引优化、配置优化、架构优化等。以下是一些常见的 MySQL 优化方法: 查询优化 避免全表扫描:确保查询能够使用索引,避免 SELECT *,只选择需要…...
docker-compose方式启动Kafka Sasl加密认证(无zk)
首先参考文档,思考过程可以进行参考https://juejin.cn/post/7294556533932884020#heading-3 用的镜像是Bitnami,对SASL配置进行了简化,需要按照特定格式去配置jass验证 完整配置如下 镜像版本参考:https://hub.docker.com/r/bitn…...
Grafana接入Zabbix数据源
1. 对接 Zabbix 1.1 安装 Zabbix 插件 在线安装: 1.2 配置 Zabbix 数据源 点击 Configuration > Data Sources > Add data source。选择 Zabbix,填写: URL:http://<zabbix-server>/api_jsonrpc.phpUsername&#x…...
华为在不同发展时期的战略选择(节选)
华为在不同发展时期的战略选择(节选) 添加图片注释,不超过 140 字(可选) 来源:谢宁专著《华为战略管理法:DSTE实战体系》。本文有节选修改。 导言 从目前所取得的成就往回看,华为…...
【计算机网络】TCP协议相关总结,TCP可靠性的生动讲解
TCP 可靠性 确保快递不丢、不乱、不过载 机制作用(快递类比)防止的问题检验和检查包裹是否损坏,损坏就重新发数据出错序列号给每个包裹编号,按顺序整理乱序、重复确认应答每送到一件,就让收件人签收丢失滑动窗口控制…...
lua基础语法学习
lua基础语法学习 文章目录 lua基础语法学习1. 基础2. 输入输出3. 分支结构与循环结构4. 函数5. 元表与元方法6. 面向对象 1. 基础 注释 --单行注释--[[ 多行注释 --]]标识符 标识符以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上 0 个或多个字母,下划线&…...
