AWS SDK for Java 1.x 403问题解决方法和原因

news/2025/2/27 0:35:27

问题表现

使用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的生成过程涉及路径拼接逻辑与双斜杠转义机制,具体流程如下:

@Override
   public HttpRequestBase create(final Request<?> request,
                                 final HttpClientSettings settings)
           throws
           FakeIOException {
       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 fail
       if (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/... ,导致签名不匹配。


http://www.niftyadmin.cn/n/5869319.html

相关文章

SQLMesh 系列教程9- 宏变量及内置宏变量

SQLMesh 的宏变量是一个强大的工具&#xff0c;能够显著提高 SQL 模型的动态化能力和可维护性。通过合理使用宏变量&#xff0c;可以实现动态时间范围、多环境配置、参数化查询等功能&#xff0c;从而简化数据模型的开发和维护流程。随着数据团队的规模扩大和业务复杂度的增加&…

一文掌握Selenium的详细使用

文章目录 1. 安装 Selenium1.1 安装 Selenium 库1.2 下载浏览器驱动 2. 基础用法2.1 启动浏览器2.2 查找元素2.3 操作元素 3. 高级功能3.1 等待机制3.2 处理弹窗3.3 执行 JavaScript3.4 切换窗口或 iframe3.5 处理 Cookies3.6 截图3.7 处理下拉菜单 4. 浏览器选项4.1 无头模式&…

Jenkins垃圾清理指南

文章目录 1. Jenkins是什么2. 哪些部分容易产生垃圾3. Jenkins垃圾清理方案3.1 单Job配置&#xff1a;自动清理旧构建3.2 全局统一清理&#xff1a;Slicing插件批量操作3.3 本地缓存清理 4. 空间预警 1. Jenkins是什么 Jenkins是一款开源的持续集成与持续交付&#xff08;CI/C…

Dify部署

Dify部署 安装docker 要在CentOS 7上部署Docker社区版&#xff0c;您可以按照以下步骤进行操作&#xff1a; 卸载旧版本的Docker&#xff08;如果有&#xff09;&#xff1a; yum remove docker docker-client docker-client-latest docker-common docker-latest docker-l…

简易电子秤系统机理分析与改进

一、引言 简易电子秤作为日常生活与商业活动中常用的称重设备,其准确性、稳定性和便捷性至关重要。了解其系统机理,有助于发现潜在问题并进行针对性改进,以满足不断提高的使用需求。 二、系统机理剖析 (一)传感器工作原理 简易电子秤核心部件之一是压力传感器,常见的…

【R语言】dplyr包经典函数summarise函数

dplyr包经典函数summarise函数&#xff0c;后面改名乘reframe函数了&#xff0c;但是summarise仍然适用 这个函数的返回结果是一个新的数据框&#xff0c;下面讲一下几种常见用法 示例数据为R自带的数据集mtcars 1.不分组 mtcars %>%summarise(mean mean(disp), n n()…

SSD 固态硬盘存储密度的分区

SSD&#xff08;固态硬盘&#xff09;的存储密度是指在单位物理空间内所能存储的数据量&#xff0c;它是衡量 SSD 性能和成本效益的关键指标之一。下面从影响因素、不同闪存类型的存储密度表现、存储密度提升的意义和挑战等方面进行分析&#xff1a; 影响 SSD 存储密度的因素 …

2024年12月 GESP C++等级考试真题 一级

2024年12月 GESP C等级考试真题 一级 gesp试卷真题可前往下方链接查看&#xff0c;支持在线答题&#xff0c;在线测评&#xff5e; GESP C等级考试 一级&#xff08;2024年12月&#xff09;_c_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tidan/cpp/show-241.html?_…