我最近将我的计算机升级到 Windows 11。在升级之前,我可以使用 SSL 通过 IIS 和 IIS Express 连接到本地主机。
升级后,我可以通过标准 HTTP 连接到本地主机,但不能通过 HTTPS 连接。
我尝试过以下方法:
到目前为止还没有任何效果。我不断得到:
无法访问该页面。连接已重置。
我打开 Chrome,状态为 (failed)net::ERR_CONNECTION_RESET
我完全不知所措,不知道发生了什么事。如有任何帮助,我们将不胜感激。
我解决了这个问题。
显然,我用于支持站点和 IIS Express 中 SSL 的证书不符合 TLS 1.3。
我怀疑它是 TLS 1.3,但不知道如何为 IIS Express 和 IIS 关闭它。
如果您进入 IIS 并编辑站点的绑定,则会有一个选项“禁用 TCP 上的 TLS 1.3”
设置此设置并访问 IIS 上的网站后,我发现它已连接,并且系统提示我输入 PKI 客户端证书。
使用 IIS Express,我不得不采取不同的策略。
我首先删除了 IIS Express 中一个测试站点的绑定:
netsh http delete sslcert ipport=0.0.0.0:44325
然后我将其添加回使用: netsh http add sslcert ipport=0.0.0.0:44325 certhash= appid={214124cd-d05b-4309-9af9-9caa44b2b74a} verifyclientcertreplication=禁用 certstorename=我的disabletls13=启用
关键是disabletls13设置。
这些设置的列表可在 Windows Server 2019 通过证书绑定禁用 IIS 中的旧版 TLS 不可用
我再次将它们发布在这里,以防止链接腐烂:
Usage: add sslcert hostnameport=<name:port> | ipport=<ipaddr:port> | ccs=<port>
appid=<GUID>
[certhash=<string>]
[certstorename=<string>]
[verifyclientcertrevocation=enable|disable]
[verifyrevocationwithcachedclientcertonly=enable|disable]
[usagecheck=enable|disable]
[revocationfreshnesstime=<u-int>]
[urlretrievaltimeout=<u-int>]
[sslctlidentifier=<string>]
[sslctlstorename=<string>]
[dsmapperusage=enable|disable]
[clientcertnegotiation=enable|disable]
[reject=enable|disable]
[disablehttp2=enable|disable]
[disablequic=enable|disable]
[disablelegacytls=enable|disable]
[disabletls12=enable|disable]
[disabletls13=enable|disable]
[disableocspstapling=enable|disable]
编辑 - 02/03/2023:
我确认问题是 TLS 1.3。
我可以通过打开/关闭 IIS 中的设置来重现该问题。在 IIS Expression 中,我未禁用 TLS 1.3 的应用程序无法访问,而我禁用 TLS 1.3 的单个应用程序是可访问的。
因为我在 Visual Studio 中测试了许多应用程序,在找到此问题的解决方案之前,对我来说最有效的方法是显式启用 TLS 1.2 并禁用 TLS 1.3。
这是禁用 TLS 1.3 的 PowerShell 脚本:
New-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server' -Force
New-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Client' -Force
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server' -Name 'Enabled' -Value 1 -PropertyType DWORD
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server' -Name 'DisabledByDefault' -Value 0 -PropertyType DWORD
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Client' -Name 'Enabled' -Value 1 -PropertyType DWORD
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Client' -Name 'DisabledByDefault' -Value 0 -PropertyType DWORD
Write-Host "Enabling TLSv1.3"
我仍然希望有人知道这个问题的原因是什么以及如何解决它。我讨厌这个解决方案,因为它不符合“永远前进,永不后退”的最佳安全实践,但我不知道还能做什么。
从您的评论我了解到您正在使用SSL与客户端身份验证。我在 Windows Server 2022 上遇到了类似的问题。我认为以下内容也适用于 Windows 11。
IETF TLS 邮件列表上的这个帖子阐明了该问题及其与 TLS 1.3 的关系(重点是我的):
Microsoft Windows Server 2022 支持使用 TLS 1.3 的握手后作为默认身份验证方法。这意味着,在我们可以通过 IIS 和 TLS 1.3 协议使用证书基础身份验证之前,我们必须将默认配置从握手后身份验证方法更改为握手中身份验证方法。因此,默认情况下,它会影响所有想要在 IIS 中使用 TLS 1.3 启用基于证书的身份验证的 Microsoft 客户,因为使用 TLS 1.3 启用基于证书的身份验证会导致 err_connection_reset 错误。
本质上,TLS 1.3 握手后身份验证类似于通过 TLS 提供的重新协商进行的客户端身份验证 <= 1.2. An important difference is that TLS 1.3 握手后身份验证是可选的,主要浏览器选择不支持它。
这解释了为什么禁用 TLS 1.3 可以解决问题。
更细粒度的解决方案是保持 TLS 1.3 启用并在 IIS 绑定上使用
clientcertnegotiation=Enable
:
netsh http add sslcert
ipport=0.0.0.0:44325 certhash=[...] appid=[...] certstorename=MY
clientcertnegotiation=Enable
据我了解,这就是前面提到的从握手后身份验证到握手中身份验证的变化。
您正在 Windows 11 计算机上运行 IIS?
您是否尝试过重新启动 IIS 服务?
您的防火墙怎么样,是否已打开?作为测试,尝试禁用它,看看是否能够达到 443,它可能由于某种原因阻止了 https 流量。
您没有对流量使用 SSL 证书?是否已安装并且仍然有效?
您可以设置一个临时测试来看看是否有效(空白页)?
.NET Framework Web App 也有同样的错误,但 Core Web App 运行良好。
重新安装 IIS Express 解决了该问题。