Windows服务器TLS协议
今天在Windows Admin Center里试图安装扩展插件的时候遇到一个问题。在可用插件里没有任何显示,包括各种微软自己开发的插件。
在Feeds里删除默认的链接,重新添加的时候也会遇到报错。说这不是一个有效的NuGet Feed。
经过检查,在其它WAC的配置中,这里也是同样的默认配置,是可以列出可用的扩展的。接着,就是要验证一下是否这个地址真的有问题,无法访问。在安装WAC的服务器上,访问一下这个地址https://aka.ms/sme-extension-catalog-feed 结果遇到一个TLS的报错。
这个好解决。启用这个服务器上对TLS1.2的支持就可以了。就是一些注册表键值。这个网上有很多文章。具体就是在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client
下面新建两个RED_DWORD的键值DisabledByDefault和Enabled。https://www.cnblogs.com/qishine/p/16700672.html
另外,IE选项里的高级设置里需要把TLS1.2也启用。重启系统后可以再试一下访问。因为TLS协议设置必须重启生效。
同时,也顺便增加Powershell使用TLS 1.2的访问,因为默认是不带的。 以前的文章里提到过,用一条命令就可以了。
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
重启后,发现问题依旧。这时候,再用Firefox试了一下,发现这个地址是可以打开的。
那么,现在问题就很明确了,问题出在IE这里。系统本身无法访问肯定和IE的表现一样。既然都按照要求配置了TLS1.2,那么到底哪里出问题了呢?这时候用之前文章里提到过的ssllabs网站,检测一下这个网站支持的协议。
可以看到,支持TLS 1.2和1.3。不过我的Windows 2016服务器,不支持TLS 1.3的。所以现在问题来了,TLS 1.2究竟启用成功了吗?这个需要验证一下。于是,只能先抓包看一下了。
可以看到,确实是用到了TLS 1.2但是,随后这个链接就被服务器reset了,导致无法连接。接下去需要比对一下正常情况时的包。
可以看到正常的情况下,在Client Hello之后,会有Server Hello的回包。这里首先确定也是TLS 1.2协议。但是为什么同样的协议IE和Firefox表现会不同呢?再仔细看Server Hello的回包,里面显示了使用的加密算法TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384。这个对比前面IE的Client Hello里提到的20种加密算法,仔细查看是确实没有的。所以,思路来到怎么增加这种加密算法呢?
经过查找,微软在Windows 2016的时候引入了TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384。具体可以看这篇官方文章https://docs.microsoft.com/en-us/windows-server/security/tls/tls-schannel-ssp-changes-in-windows-10-and-windows-server
也就是说不可能是因为系统版本过低导致的问题。而且Firefox也确实使用了这个加密算法。要启用这种算法,或者说调整算法的优先级,可以通过组策略。具体位置是Computer Settings--Administrative Templates--Network--SSL Configuration Settings中的SSL Cipher Suite Order。这个策略默认是不启用的。
找打它,启用后会发现我们需要TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384是包含在里面的。然后gpupdate /force,我这里又重启了一下服务器。
重新启动后,问题解决。
其实仔细看之前的IE报错,它提到了是使用了不支持的协议或者加密算法比如RC4。今天的问题就是加密算法不支持,服务器和客户端没有协商通过。
但是仔细看了一下ssllabs的检查也包含了加密算法。
仔细看,这里TLS 1.2支持的强加密算法只有3种。IE试图使用的20种算法里有不少是受支持的弱加密算法,比如0x28, 0x27, 0x14等。但是很奇怪不知道为什么服务器不使用就直接重置了链接,或许是微软服务器的安全性特别高吧。还有就是尽量用最新的系统,比如Windows server 2022,就能支持TLS 1.3更安全也能避免很多问题了。