OSS Java SDK报错SignatureDoesNotMatch,该如何处理?
1、AccessKey ID和AccssKey Secret不一致。
2、有关获取AccessKey ID和AccssKey Secret的操作步骤,请参见获取AccessKey。
签名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);
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,请参见包冲突解决方案。
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标准的字符。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。