IIS部署ASP.NET Core6绑定自定义域名报10054连接被强制关闭错误
问题根因
这个10054套接字错误发生在TLS握手阶段,说明你写的自定义证书忽略回调根本没有触发——连接在证书校验逻辑执行前就被IIS强制断开了。问题和你修改IIS域名绑定直接相关:localhost访问正常是因为系统对localhost走特殊信任逻辑,不会触发SNI匹配、证书校验、环回限制等检查逻辑。
按优先级依次排查修复
- 首先确认IIS绑定本身有效性
登录部署项目的服务器本机,用浏览器直接访问https://svdb01.sample.com.au/api/Sample,如果浏览器都报连接重置、证书无效,先修复IIS配置:- 检查443端口绑定对应的SSL证书,确认证书的使用者可选名称(SAN)包含
svdb01.sample.com.au域名,不要用随意生成的自签名证书绑定 - 如果绑定勾选了「要求服务器名称指示(SNI)」,先临时取消勾选,重启IIS站点测试。多数场景下服务器本机回环请求不会带SNI头,IIS找不到对应站点的证书配置就会直接断开连接
- 确认同服务器同IP的443端口没有其他站点的绑定冲突
- 检查443端口绑定对应的SSL证书,确认证书的使用者可选名称(SAN)包含
- 修正TLS版本配置
不要随便全局硬编码SecurityProtocol,在注册HttpClient的位置显式指定支持的TLS版本即可,修改原有配置代码:
builder.Services.AddHttpClient<ISampleClient, SampleClient>() .ConfigurePrimaryHttpMessageHandler(sp => { HttpClientHandler clientHandler = new HttpClientHandler(); // 显式启用TLS1.2/1.3,和IIS配置的TLS版本保持对齐 clientHandler.SslProtocols = System.Security.Authentication.SslProtocols.Tls12 | System.Security.Authentication.SslProtocols.Tls13; clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; }; return clientHandler; });
- 修复HttpClient的用法错误
你现在每次发起请求都往DefaultRequestHeaders里重复添加Keep-Alive相关头,而Typed Client注入的HttpClient是全局复用的,多次请求后会出现重复请求头,IIS会直接拒绝这类非法请求。把加头的逻辑移到构造函数中仅执行一次,不要每次请求都重复添加:
public SampleClient(HttpClient httpClient, IMapper mapper, IConfiguration config) { _httpClient = httpClient; _mapper = mapper; _config = config; _httpClient.BaseAddress = new Uri(_config["BaseAddress"]); // 请求头仅在实例初始化时添加一次 _httpClient.DefaultRequestHeaders.ConnectionClose = false; _httpClient.DefaultRequestHeaders.Add("Keep-Alive", "3600"); } private async Task<T> GetAsync<T>(string url) { // 删除此处重复添加请求头的代码 return await _httpClient.GetFromJsonAsync<T>(url); }
- 内部测试场景推荐终极绕开方案
服务内部调用根本没必要走外网域名绕一圈做SSL握手,直接给站点加一个仅本机访问的HTTP绑定(比如http://localhost:5000,不绑定证书),把配置里的BaseAddress改成这个本地地址即可,既不会有SSL连接问题,性能也比走域名HTTPS高很多。如果是OutOfProcess托管的ASP.NET Core,也可以直接把BaseAddress指向Kestrel默认监听的本地端口,完全绕开IIS的HTTPS层。
内容的提问来源于stack exchange,提问作者Gino Mortillero
相关产品推荐
相关产品推荐

