使用预签名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 } ); }
排查与解决步骤
修正Bucket名称不一致问题
docker-compose中Minio默认创建的Bucket是coespace-studio,但代码中使用的Bucket是my-bucket,这是导致签名不匹配的核心原因。将代码中Bucket: 'my-bucket'替换为Bucket: 'coespace-studio'即可。调整Region配置
部分AWS SDK v3版本对autoregion的兼容性不佳,建议显式设置为Minio默认区域us-east-1,修改createClient中的region参数:region: 'us-east-1',验证环境变量加载正确性
确认process.env中的配置未被覆盖,可在createClient中添加打印语句验证:console.log('Loaded Endpoint:', process.env.STORAGE_ENDPOINT); console.log('Loaded Access Key:', process.env.STORAGE_ACCESS_KEY_ID);同时注意密钥区分大小写,确保与Minio配置完全一致。
检查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
相关产品推荐
相关产品推荐

