Node.js 22 LTS 升到 24 LTS:OpenSSL 3.5 默认安全级别 2,老证书会先连不上
Node.js 24.11.0 发布后,Node.js 24 发布线进入 Long-Term Support (LTS),代号 Krypton,持续更新到 2028 年 4 月底。下面是 Node.js 22 LTS 升到 24 时,来自 Node.js 23.0.0 与 24.0.0 两条发布线的破坏性变更与排查顺序。官方迁移指南见 Node.js v22 to v24 migration guide。
预编译二进制
- 自 Node.js 23.0.0 起不再提供 32 位 Windows (x86) 预编译二进制。
- 自 Node.js 24.0.0 起不再提供 32 位 Linux on armv7 预编译二进制。
- macOS 预编译二进制现在要求最低 macOS 13.5。
- Linux 上的 arm64、ppc64le、s390x、x64 预编译二进制继续兼容 glibc 2.28 及以上(与 Node.js 22 相同)。
CI 里还挂着 win32/x86 或 armv7 runner 的,升级前先把这些 job 换掉或改成源码构建。
OpenSSL 3.5:默认安全级别 2
Node.js 24 LTS 的预编译二进制(或用默认构建配置自行构建的产物)包含 OpenSSL 3.5。Node.js 24 LTS 使用 OpenSSL 3.5 的默认安全级别 2,意味着:
- 短于 2048 位的 RSA、DSA、DH 密钥,以及短于 224 位的 ECC 密钥,被禁止。
- 任何使用 RC4 的 cipher suite,同样被禁止。
这条通常在升级后第一时间暴露:出站 HTTPS 指向还在用 1024 位 RSA 证书的服务,或对端 cipher 列表里还留着 RC4,都会直接握手失败。如果依赖旧的密钥或弱 cipher,升级前应针对 Node.js 24 构建测试工作负载,或者先调整密钥长度与 cipher 选择。检查现有证书的密钥位数和对端 cipher 列表,是这一步的入口动作。
其他行为变化与参数校验
- fetch() 的合规性检查更严格。
- AbortSignal 参数校验加强。
- stream/pipe 错误现在会抛出。
- Buffer 行为有变化。
- Windows 上的路径处理修复。
- test runner 默认值调整。
原生扩展与构建工具链
链接 V8 API 的 addon 可能需要针对 V8 13.6 更新;过去用 C++17 的地方可能需要 C++20。尽量用 NODE-API,减少每次大版本都要重新编译的负担。
从源码构建时:AIX 与 Linux 平台最低 gcc 版本为 12.2;macOS 最低 Xcode 版本为 16.1。
Node.js 24.0.0 本身的变化
- V8 升级到 13.6,npm 升级到 11。
- 从 Node.js 24 起移除对 MSVC 的支持,Windows 上编译 Node.js 现在需要 ClangCL。
- AsyncLocalStorage API 现在默认使用 AsyncContextFrame。
- URLPattern 全局可用。
弃用与移除(23/24)
- url.parse() 运行时弃用,改用 WHATWG URL API。
- 移除已弃用的 tls.createSecurePair。
- SlowBuffer 运行时弃用。
- 不带 new 实例化 REPL 弃用。
- 不带 new 使用 Zlib 类弃用。
- 向 child_process 的 spawn 和 execFile 传 args 弃用。
官方 codemod
针对 23/24 的破坏性变更或 EOL 弃用,官方提供了一批 codemod:
- DEP0154:crypto 模块 generateKeyPair/generateKeyPairSync 对
'rsa-pss'的 hash、mgf1Hash、saltLength 选项弃用,改用 hashAlgorithm、mgf1HashAlgorithm、saltLength。 dirent.path→dirent.parentPath。- fs 的 F_OK/R_OK/W_OK/X_OK getter 运行时弃用,改从
fs.constants或fs.promises.constants取。 - fs.truncate 与文件描述符一起用时弃用(DEP0081),改用
fs.ftruncate。 - http2 priority 信令弃用,移除
http2.connect()、session.request()、stream.priority()、client.settings()的 priority 相关选项/方法。 - DEP0100 在 v23 达到 EOL,process.assert 被移除,改用 assert 模块。
createSecurePair()→TLSSocket()。