You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用预签名URL上传文件到本地Minio时出现SignatureDoesNotMatch错误

本地Minio预签名URL出现SignatureDoesNotMatch错误的排查与解决

问题现象

搭建本地Minio实例用于文件上传下载,通过代码生成的预签名URL操作时收到SignatureDoesNotMatch响应,但Minio管理UI生成的预签名URL可正常下载文件。连接Cloudflare R2时功能正常,但本地/CI环境不想使用R2,怀疑是配置问题但无法定位。

相关配置与代码

.env文件

STORAGE_ENDPOINT="http://localhost:9000"
STORAGE_ACCESS_KEY_ID="user"
STORAGE_SECRET_ACCESS_KEY="password"

docker-compose.yaml文件

services:
  storage:
    container_name: coespace-storage
    image: minio/minio
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - coespace-storage:/data
    environment:
      MINIO_ACCESS_KEY: user
      MINIO_SECRET_KEY: password
      MINIO_DEFAULT_BUCKETS: 'coespace-studio'
    command: server --address 0.0.0.0:9000 --console-address 0.0.0.0:9001 /
# more unrelated services...

JS代码

function createClient() {
  return new S3Client({
    region: 'auto',
    endpoint: process.env.STORAGE_ENDPOINT,
    forcePathStyle: true,
    credentials: {
      accessKeyId: process.env.STORAGE_ACCESS_KEY_ID,
      secretAccessKey: process.env.STORAGE_SECRET_ACCESS_KEY,
    },
  });
}

const s3 = createClient();

export function getPreSignedDownloadUrl(key: string) {
  return getSignedUrl(
    s3,
    new GetObjectCommand({
      Bucket: 'my-bucket',
      Key: key,
    }),
    {
      expiresIn: 60 * 60, // expires in an hour
    }
  );
}

export function getPreSignedUploadUrl(key: string) {
  return getSignedUrl(
    s3,
    new PutObjectCommand({
      Bucket: 'my-bucket',
      Key: key,
    }),
    {
      expiresIn: 60 * 60, // expires in an hour
    }
  );
}

排查与解决步骤

  1. 修正Bucket名称不一致问题
    docker-compose中Minio默认创建的Bucket是coespace-studio,但代码中使用的Bucket是my-bucket,这是导致签名不匹配的核心原因。将代码中Bucket: 'my-bucket'替换为Bucket: 'coespace-studio'即可。

  2. 调整Region配置
    部分AWS SDK v3版本对auto region的兼容性不佳,建议显式设置为Minio默认区域us-east-1,修改createClient中的region参数:

    region: 'us-east-1',
    
  3. 验证环境变量加载正确性
    确认process.env中的配置未被覆盖,可在createClient中添加打印语句验证:

    console.log('Loaded Endpoint:', process.env.STORAGE_ENDPOINT);
    console.log('Loaded Access Key:', process.env.STORAGE_ACCESS_KEY_ID);
    

    同时注意密钥区分大小写,确保与Minio配置完全一致。

  4. 检查SDK与Minio版本兼容性
    若使用过高版本的AWS SDK v3,可能与旧版Minio存在签名算法兼容性问题,可尝试锁定SDK版本到稳定版,比如@aws-sdk/client-s3@3.350.0、@aws-sdk/s3-request-presigner@3.350.0。

内容的提问来源于stack exchange,提问作者Nils Haberkamp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 06:22:04