PAYATHON 2026

Windows 7 安装 Node 时 Chocolatey 无法使用 TLS 1.2

排障赵师傅

结论

Windows 7 SP1 的 Schannel 支持 TLS 1.2。PowerShell 返回 False,通常说明当前进程加载的 .NET Framework 版本较旧,System.Net.SecurityProtocolType 枚举中没有 Tls12 这个名称,并不表示操作系统没有 TLS 1.2。

修改 Schannel 注册表不会改变 .NET 枚举,因此重启后仍可能返回 False。解决 Chocolatey 下载错误时,一般需要检查以下几项:

  1. Windows 7 SP1 及相关系统更新。
  2. .NET Framework 和 PowerShell 的版本。
  3. Schannel 的 TLS 1.2 客户端配置。
  4. .NET Framework 的强加密和系统默认 TLS 配置。

Windows 7 已停止支持,当前版本的 Node.js、Chocolatey、Visual Studio Build Tools 及其依赖不一定还能在该系统上安装。要获得长期稳定的支持,建议升级到仍受支持的 Windows 版本。

为什么检测命令会返回 False

下面的命令检查的是当前 .NET 运行时公开的枚举成员:

[Enum]::GetNames([Net.SecurityProtocolType]) -contains 'Tls12'

它不会直接检测 Windows Schannel 是否实现了 TLS 1.2。

即使系统支持 TLS 1.2,当前 PowerShell 加载的旧版 CLR 也可能不认识 Tls12。这种情况在 Windows PowerShell 2.0 或旧版 .NET Framework 环境中较为常见。

先查看实际运行环境:

$PSVersionTable
[Environment]::Version
[Enum]::GetNames([Net.SecurityProtocolType])

如果 PowerShell 使用 -Version 2 参数启动,请去掉该参数,因为 PowerShell 2.0 会使用较旧的运行环境。

推荐处理顺序

1. 确认系统是 Windows 7 SP1

后续安装 .NET Framework、Windows Management Framework 和 TLS 更新,通常都要求系统已升级到 Windows 7 SP1。先运行:

winver

如果系统还不是 SP1,请先安装 SP1,再通过可信的 Microsoft 更新来源补齐系统更新、SHA-2 代码签名支持和根证书更新。

部分使用 WinHTTP 的程序还需要 KB3140245 提供默认安全协议支持。Chocolatey 的下载方式会随版本变化,仅安装这一个补丁未必能解决所有问题。

2. 更新 .NET Framework 和 PowerShell

如果必须继续使用 Windows 7,应安装该系统兼容的较新版本 .NET Framework,并改用 Windows PowerShell 5.1,避免继续运行 PowerShell 2.0。

Windows 7 SP1 可以安装 .NET Framework 4.8,但安装包及其前置更新需要来自可信来源。Windows PowerShell 5.1 包含在 Windows Management Framework 5.1 中,也需要满足相应的系统和 .NET 前置条件。

安装并重启后,重新打开 PowerShell,执行:

$PSVersionTable.PSVersion
[Environment]::Version
[Enum]::GetNames([Net.SecurityProtocolType]) -contains 'Tls12'

此时通常应该能够识别 Tls12。如果结果仍为 False,请确认当前打开的是更新后的 powershell.exe,并检查快捷方式或脚本是否仍强制使用 PowerShell 2.0 模式。

3. 启用 Schannel 的 TLS 1.2 客户端

Chocolatey 在这里充当客户端,因此需要配置 TLS 1.2\Client。导入注册表前,请备份相关注册表项或创建系统还原点。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

原配置只有 DisabledByDefault=0。显式添加 Enabled=1 后,不必依赖系统默认值。

如果这台计算机不提供 HTTPS 服务,无须仅为 Chocolatey 配置 TLS 1.2\Server。解决当前问题也不需要 TLS 1.1。

修改注册表后需要重启 Windows。

4. 配置 .NET Framework 使用强加密

对于使用 64 位或 32 位 .NET Framework 的程序,可以设置以下注册表项:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
"SystemDefaultTlsVersions"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
"SystemDefaultTlsVersions"=dword:00000001

SchUseStrongCrypto 会让相关 .NET 客户端优先使用较强的协议和加密套件。SystemDefaultTlsVersions 则让 .NET 使用操作系统选择的默认 TLS 版本。

这些设置需要相应的 .NET Framework 和 Windows 更新支持。注册表项无法为旧系统补充缺失的 TLS 实现。

在当前 PowerShell 进程中指定 TLS 1.2

确认枚举中已经包含 Tls12 后,可以在运行 Chocolatey 安装脚本前执行:

[Net.ServicePointManager]::SecurityProtocol =
    [Net.ServicePointManager]::SecurityProtocol -bor
    [Net.SecurityProtocolType]::Tls12

再检查当前设置:

[Net.ServicePointManager]::SecurityProtocol

如果输出中包含 Tls12,当前 PowerShell 进程就会尝试使用 TLS 1.2。该设置只对当前进程有效,关闭 PowerShell 后不会保留。

有些资料会用数值 3072 强制表示 TLS 1.2:

[Net.ServicePointManager]::SecurityProtocol = 3072

这种写法可以绕过旧枚举没有名称的问题,但无法补齐缺失的系统更新、证书或加密套件。更稳妥的做法是更新 .NET Framework 和 PowerShell,不要把数值写法当成完整的修复方案。

SSL 2.0 注册表项需要处理吗

不需要为 Chocolatey 启用 SSL 2.0,也不应在该注册表项下添加启用配置。SSL 2.0 已经过时且不安全,无法解决 TLS 1.2 连接问题。

也不要为了排错重新启用 SSL 3.0、TLS 1.0 或其他旧协议。如果 Chocolatey 软件源要求 TLS 1.2,启用旧协议不会使连接成功。

仍然无法连接时应检查什么

即使 PowerShell 已经显示 Tls12,连接仍可能因以下原因失败:

  • 系统根证书过旧,无法验证服务器证书。
  • Windows 7 缺少 SHA-2 或 Schannel 相关更新。
  • 代理服务器、防火墙或安全软件拦截 HTTPS。
  • 企业代理使用了系统不信任的内部 CA 证书。
  • 系统日期、时间或时区错误。
  • 服务端只接受 Windows 7 不具备的加密套件。
  • 当前 Chocolatey、Node.js 或 Visual Studio Build Tools 已不再支持 Windows 7。

可以先查看系统是否配置了代理:

netsh winhttp show proxy

如果使用公司网络,还需要向管理员确认 HTTPS 检查代理的根证书是否已正确安装。

Node.js 是否必须通过 Chocolatey 安装

Node.js 运行时通常可以使用官方 MSI 单独安装。安装程序中的附加工具选项主要用于安装编译部分原生 npm 模块所需的 Python、Visual Studio Build Tools 等组件,而这些工具可能通过 Chocolatey 安装。

如果只需要运行 Node.js 或安装纯 JavaScript 包,可以取消附加工具选项,单独安装与 Windows 7 兼容的旧版 Node.js。旧版 Node.js 已停止安全维护,不适合连接不可信网络,也不适合用于生产环境。

如果当前发布版 Node.js、Chocolatey 或构建工具明确要求更高版本的 Windows,继续调整 TLS 注册表也无法解决操作系统兼容性问题,只能升级 Windows。

备注:内容仅供参考。