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

复制代码
@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()endpointresourcePath 拼接为:

复制代码
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/... ,导致签名不匹配。

相关推荐
数据与人工智能律师3 小时前
数字迷雾中的安全锚点:解码匿名化与假名化的法律边界与商业价值
大数据·网络·人工智能·云计算·区块链
Johny_Zhao14 小时前
Centos8搭建hadoop高可用集群
linux·hadoop·python·网络安全·信息安全·云计算·shell·yum源·系统运维·itsm
_可乐无糖1 天前
AWS WebRTC:我们的业务模式
云计算·音视频·webrtc·aws
Kentos(acoustic ver.)1 天前
云原生 —— K8s 容器编排系统
云原生·容器·kubernetes·云计算·k8s
Britz_Kevin1 天前
从零开始的云计算生活——番外6,使用zabbix对中间件监控
云计算·生活·zabbix
贺贺丿2 天前
Docker2-容器应用工具及docker命令
linux·运维·docker·容器·自动化·云计算
程序猿追2 天前
亚马逊云科技:引领云计算新时代,开启无限可能
科技·云计算·亚马逊
果子⌂2 天前
Kubernetes 服务发布进阶
linux·运维·服务器·云原生·容器·kubernetes·云计算
青梅主码-杰哥2 天前
中央广播电视总台联合阿里云研究院权威发布《中国人工智能应用发展报告(2025)》:我国依旧需要大力注重人工智能人才的培养
人工智能·阿里云·云计算
NUZGNAW2 天前
等保二级、三级配置表(阿里云)
阿里云·云计算