minio签名不一致问题 #
错误响应信息 #
xml
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
<BucketName>digsys</BucketName>
<Resource>/digsys/</Resource>
<RequestId>17A320A1696E46F6</RequestId>
<HostId>e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855</HostId>
</Error>
原因 #
minio sdk 对请求进行签名时,待签名信息中包含请求接口URL(URL前缀来自 endpoint 配置),与 minio 后端服务认为的域名地址不一致。 minio 后端服务未配置自定义域名,且中间存在反向代理服务,域名、端口、协议不一致等等,会导致签名不一致。
签名代码(io.minio:minio:8.0.3):
- io.minio.Signer#signV4S3(Request, String, String, String, String)
- io.minio.Signer#setPresignCanonicalRequest(int expires)
- io.minio.Signer#canonicalRequest
解决方案 #
(1) minio 后端服务添加【自定义域名】环境变量(for docker): MINIO_SERVER_URL=https://minio.example.com
(截至2023年5月的最新版本,尚不支持在域名后添加相对路径,请合理规划域名或合理分配Bucket名称)
(2) 客户端配置正确的 endpoint 地址: https://minio.example.com