使用MinIO SDK 向OSS上传文件报SignatureDoesNotMatch错误解决方案

LonelyMan 1882 2022-12-07

起因

阿里云OSS官方说明完全兼容S3协议,所以在开发中我们使用的是MinIO的SDK

最近开发时,在连接OSS上传对象的请求发送后返回SignatureDoesNotMatch错误,同样的请求发送给MinIO就是正常的

错误信息如下(部分信息用xxxx代替)

PUT /14e34435ecc1ecdbxxxxxxxxxxxxx/xxx/177BC075ED7031E3XXXXXXXXXXXX/PSAXXXXX.ocf HTTP/1.1
x-amz-meta-default: 0,1082778
x-amz-meta-_offset-keys: ,5F50617065725F53XXXXXXXXXXXX,5F50617065725F53XXXXXXXXXXXX0
x-amz-meta-Content-MD5: 039b3b9707209c732xxxxxxxxxxxxx
x-amz-meta-5F50617065725F5370616365: 1082778,161
x-amz-meta-5F50617065725F537061636530: 1082939,162
Content-Type: application/octet-stream
Host: xxxxxxxxxxxxxx.oss-cn-shanghai.aliyuncs.com
Accept-Encoding: identity
User-Agent: MinIO (amd64; amd64) minio-java/3.0.1
Content-MD5: 9mpNHGT7oGpxxxxxxxxxxxx==
x-amz-content-sha256: UNSIGNED-PAYLOAD
x-amz-date: 20221207T014227Z
Authorization: AWS4-HMAC-SHA256 Credential=*REDACTED*/20221207/us-east-1/s3/aws4_request, SignedHeaders=accept-encoding;content-md5;host;x-amz-content-sha256;x-amz-date;x-amz-meta-5f50617065725f5370616365;x-amz-meta-5f50617065725f537061636530;x-amz-meta-_offset-keys;x-amz-meta-content-md5;x-amz-meta-default, Signature=*REDACTED*

HTTP/1.1 403
Server: AliyunOSS
Date: Wed, 07 Dec 2022 01:42:26 GMT
Content-Type: application/xml
Content-Length: 280
Connection: keep-alive
x-amz-request-id: 638FEF82E5C23A3XXXXXXXXX
Vary: Origin
x-oss-server-time: 0

<?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>SignatureDoesNotMatch</Code>
  <Message>Not all the signed headers are found in the request.</Message>
  <RequestId>638FEF82E5C23A3XXXXXXXX</RequestId>
  <HostId>xxxxxxxxxxxx.oss-cn-shanghai.aliyuncs.com</HostId>
</Error>

因为显示的是SignatureDoesNotMatch错误,就以为是S3协议版本问题,但是OSS上并没有设置协议版本的相关选项

原因

通过查询阿里云OSS官方文档,发现官方对元数据头meta有一个特殊声明

名称 类型 是否必选 示例值 描述
x-oss-meta-* 字符串 x-oss-meta-location 使用PutObject接口时,如果配置以**x-oss-meta-***为前缀的参数,则该参数视为元数据,例如x-oss-meta-location。一个Object可以有多个类似的参数,但所有的元数据总大小不能超过8 KB。元数据支持短划线(-)、数字、英文字母(a~z)。英文字符的大写字母会被转成小写字母,不支持下划线(_)在内的其他字符

我们在请求中定义了x-amz-meta-_offset-keys请求头,中间刚好就有_,MinIO对_没有特殊要求,但是OSS有,所以导致报错

解决方案

x-amz-meta-_offset-keys请求头修改为x-amz-meta-offset-keys即可

引用

对象存储 OSS - API参考 - 关于Object操作 - 基础操作 - PutObject - 请求头