使用AWS SDK .NET生成Cloudflare R2预签名URL遇SigV2不支持错误
解决Cloudflare R2预签名URL生成的SigV2不支持错误
问题原因
你遇到的错误SigV2 authorization is not supported. Please use SigV4 instead,核心原因是Cloudflare R2仅支持SigV4签名算法,完全弃用了老旧的SigV2。而AWS SDK的GetPreSignedURL方法默认会使用SigV2生成签名,导致R2直接拒绝请求。
关于你提到的文档误解:Cloudflare R2是支持SigV4的,官方文档中明确说明的是不支持SigV2,你可能看反了描述。另外GetObjectAsync能正常工作,是因为该方法在SDK中默认使用了SigV4签名,无需额外配置。
解决方案
修改S3客户端配置,强制指定使用SigV4签名版本,同时需要设置区域端点(R2兼容us-east-1或你实际使用的R2区域):
修改后的完整代码
private static AmazonS3Client GetS3Client() { var credentials = new BasicAWSCredentials(accessKey, secretKey); return new AmazonS3Client(credentials, new AmazonS3Config { ServiceURL = "你的R2存储桶端点", SignatureVersion = SignatureVersion.SigV4, // R2兼容us-east-1,若你的R2有指定区域可替换为对应RegionEndpoint RegionEndpoint = RegionEndpoint.USEast1 }); } public static string GeneratePreSignedUrl(string fileName, TimeSpan expiry, string bucketName) { using (AmazonS3Client client = GetS3Client()) { var request = new GetPreSignedUrlRequest { BucketName = bucketName, Key = fileName, Verb = HttpVerb.GET, Expires = DateTime.UtcNow.Add(expiry), // 可选:显式指定签名版本,确保客户端配置生效 SignatureVersion = SignatureVersion.SigV4 }; return client.GetPreSignedURL(request); } }
关键配置说明
SignatureVersion = SignatureVersion.SigV4:强制SDK使用SigV4生成签名,完全匹配R2的授权要求RegionEndpoint:SigV4签名必须依赖区域信息,R2默认兼容us-east-1,如果你的R2存储桶有指定区域(如eu-central-1),请替换为对应的RegionEndpoint值
内容的提问来源于stack exchange,提问作者SpicyCatGames
相关产品推荐
相关产品推荐

