开发者社区> 问答> 正文

【OSS】OSS Java SDK报错SignatureDoesNotMatch,该如何处理?

已解决

OSS Java SDK报错SignatureDoesNotMatch,该如何处理?

展开
收起
云上猫猫 2022-01-19 16:25:31 5254 0
1 条回答
写回答
取消 提交回答
  • 采纳回答
    • 错误原因1

    1、AccessKey ID和AccssKey Secret不一致。

    2、有关获取AccessKey ID和AccssKey Secret的操作步骤,请参见获取AccessKey。

    • 错误原因2

    签名URL使用不正确。错误示例如下:

    GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, object);
    request.setExpiration( new Date(new Date().getTime() + 3600 * 1000));
    request.addUserMetadata("author");
    URL url = ossClient.generatePresignedUrl(request);
    
    Map<String, String> header = new HashMap<String, String>();
    header.put("author");
    ossClient.putObject(url, new ByteArrayInputStream("Hello OSS".getBytes()), -1, header);
    

    未指定Method参数时,默认使用GET方法。以上为PutObject请求,应指定Method参数并设置为PUT方法。

    通过PutObject发送请求时,请求Header中自定义的元数据必须以x-oss-meta-为前缀。以上示例中自定义元数据应改为x-oss-meta-author。

    解决方法:

    指定Method,并修改Header:

    request.addUserMetadata("author");
    request.setMethod(HttpMethod.PUT);
    URL url = ossClient.generatePresignedUrl(request);
    
    Map<String, String> header = new HashMap<String, String>();
    header.put("x-oss-meta-" + "author");
    ossClient.putObject(url, new ByteArrayInputStream("Hello OSS".getBytes()), -1, header);
    
    • 错误原因3

    1、使用了低于3.7.0版本的OSS SDK,项目中引入了4.5.9及以上版本的httpclient。

    2、上传的文件名中包含+字符,而4.5.9版本的httpclient不会对+进行URLEncode编码,从而造成客户端与服务端计算的签名不一致而报错。

    解决方法:

    1、OSS SDK建议升级为3.11.1及以上版本, 以兼容4.5.9版本的httpclient。

    2、移除多余的httpclient依赖。引入OSS SDK时会自动引入httpclient依赖,如果是第三方库另外引入了httpclient,请参见包冲突解决方案。

    • 错误原因4

    HttpClient 4.5.10版本不支持Header中包含ISO/9959-1标准以外的字符,但在项目中引入了4.5.10以上的httpclient,并在请求Header中包含了ISO/9959-1标准以外的字符,例如x-oss-meta-开头的自定义元数据中传入了中文字符。

    解决方法:

    1、参见包冲突解决方案,移除冲突的httpclient版本。

    2、在请求Header中传入符合ISO/9959-1标准的字符。

    2022-01-19 16:29:01
    赞同 展开评论 打赏
来源圈子
更多
收录在圈子:
问答排行榜
最热
最新

相关电子书

更多
基于Java容器的多应用部署技术实践 立即下载
从《阿里巴巴Java开发手册》编写推广谈技术成长 立即下载
如何通过 Serverless 提高 Java 微服务治理效 立即下载