minio签名不一致问题

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

2024年6月28日