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

.NET S3 SDK应用通过Direct Connect访问S3失败的问题排查求助

S3应用通过Direct Connect访问时的证书信任与域名解析问题

问题背景

  • 公网环境下正常运行的S3应用,切换到Direct Connect访问时出现异常
  • AWS CLI通过在hosts文件添加endpoint-url对应的域名映射,可正常访问S3
    -.NET代码中已将AmazonS3Config.ServiceURL设置为与CLI一致的S3接口终端节点,但先后出现两个错误:
    1. 初始报错NameResolutionFailure,提示无法解析包含终端节点的桶完整路径域名
    2. 将该桶路径域名添加到hosts后,触发信任关系失败错误
  • 推测问题根源:SDK在证书验证时使用了带桶名的请求域名,而非配置的ServiceURL域名

相关代码片段

适配Direct Connect添加的代码:

if (bucketServiceURL.Length > 0)
{
    S3Config.ServiceURL = bucketServiceURL;
}

完整初始化代码:

ThrowErrorIfNotInitialised(false);

iBucketNumber = BucketNumber;

Profile myProfile = new Profile(objConfiguration.Ourcredentials[BucketNumber]);

string strbucketRegion = objConfiguration.Ourregion[BucketNumber];

bucketServiceURL = objConfiguration.OurServiceURL[BucketNumber];

bucketName = objConfiguration.Ourbucket[BucketNumber];

TimeSpan webTimeout = objConfiguration.WebTimeoutForOps;
TimeSpan readWriteTimeout = objConfiguration.ReadWriteTimeout;

AmazonS3Config S3Config = new AmazonS3Config
{
    Timeout = webTimeout,
    ReadWriteTimeout = readWriteTimeout,
    Profile = myProfile
};

if (strbucketRegion.Length > 0)
{
    bucketRegion = RegionEndpoint.GetBySystemName(strbucketRegion);
    S3Config.RegionEndpoint = bucketRegion;
}
if (bucketServiceURL.Length > 0)
{
    S3Config.ServiceURL = bucketServiceURL;
}

client = new AmazonS3Client(S3Config);

注:公网场景下仅设置bucketRegion即可正常运行;Direct Connect测试时仅设置ServiceURL。

解决方案

1. 强制使用路径式访问(核心修复)

AWS SDK for .NET默认会将桶名拼接为请求域名的前缀(如bucket.s3.amazonaws.com),导致证书验证时域名不匹配。开启ForcePathStyle可强制SDK以ServiceURL/bucket的路径形式发送请求,证书验证将基于ServiceURL的域名:

AmazonS3Config S3Config = new AmazonS3Config
{
    Timeout = webTimeout,
    ReadWriteTimeout = readWriteTimeout,
    Profile = myProfile,
    ForcePathStyle = true // 启用路径式访问
};

2. 避免ServiceURL与RegionEndpoint冲突

当指定了Direct Connect专用的ServiceURL时,无需再配置RegionEndpoint,两者同时设置可能导致SDK生成错误的请求域名。调整代码逻辑:

// 仅当未设置ServiceURL时,才配置RegionEndpoint
if (strbucketRegion.Length > 0 && string.IsNullOrEmpty(bucketServiceURL))
{
    bucketRegion = RegionEndpoint.GetBySystemName(strbucketRegion);
    S3Config.RegionEndpoint = bucketRegion;
}
if (bucketServiceURL.Length > 0)
{
    S3Config.ServiceURL = bucketServiceURL;
}

3. 清理hosts文件冗余配置

仅保留ServiceURL对应的基础域名映射(如s3.region.amazonaws.com),删除带桶名的域名条目。开启ForcePathStyle后,SDK不会再生成带桶名的请求域名,无需额外配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:16:01