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

如何通过IPv6访问S3预签名URL?

解决S3预签名URL双栈(IPv6)访问的签名不匹配问题

你遇到的SignatureDoesNotMatch问题,核心原因是AWS4签名算法会把请求的Host头纳入签名计算。事后手动给预签名URL添加dualstack修改Host,相当于改变了签名生成时的关键参数,自然无法通过验证。

正确的做法是:生成预签名URL时直接指定S3双栈端点,而非生成后再修改URL。以下是不同工具/SDK的具体实现方式:

AWS CLI 示例

使用--endpoint-url参数指定双栈端点,生成的预签名URL会自动包含双栈Host:

aws s3 presign s3://my-bucket/FILE.zip --endpoint-url https://s3.dualstack.eu-central-1.amazonaws.com --expires-in 120

Python Boto3 示例

Boto3 1.16.0及以上版本支持直接启用双栈端点,无需手动拼接URL:

import boto3

# 创建启用双栈的S3客户端
s3_client = boto3.client(
    's3',
    region_name='eu-central-1',
    use_dualstack_endpoint=True
)

# 生成预签名URL
presigned_url = s3_client.generate_presigned_url(
    'get_object',
    Params={'Bucket': 'my-bucket', 'Key': 'FILE.zip'},
    ExpiresIn=120
)

Java SDK 示例

通过客户端构建器启用双栈端点:

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;

public class S3PresignedDualstack {
    public static void main(String[] args) {
        S3Client s3Client = S3Client.builder()
                                    .region(Region.EU_CENTRAL_1)
                                    .dualstackEnabled(true)
                                    .build();

        GetObjectRequest request = GetObjectRequest.builder()
                                                  .bucket("my-bucket")
                                                  .key("FILE.zip")
                                                  .build();

        String presignedUrl = s3Client.utilities().getUrl(request).toString();
        System.out.println(presignedUrl);
    }
}

按照上述方式生成的预签名URL,会自动使用双栈端点(包含dualstack标识),且签名与Host完全匹配,IPv6环境下可直接访问,无需额外变通方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:27:48