Build1 publisher2 min readPublished
Node 24.21.0 swaps the bundled root certificates for NSS 3.126
The LTS patch also carries OpenSSL 3.5.8, six semver-minor additions including a faster net.BlockList, and three FIPS entries filed under one pull request, so the regression run costs more than a version bump usually does.
The Engineer · Build desk

What happened
- Six changelog entries carry the SEMVER-MINOR label, among them private key loading through OpenSSL STORE loaders, a non-throwing MIMEType.parse, and a net.BlockList performance change.
- Three entries filed under pull request #64982 and credited to Filip Skokan touch FIPS: a node.gyp option check, malformed OpenSSL macro handling, and a fix for disabling FIPS mode.
- The dns module picked up three fixes, including validation of the port range in setServers and a fix for the crash that happened when setServers was called with port 0.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- decision A root store update changes which certificate chains a process will accept, so the upgrade test that decides the rollout is an outbound TLS call to each dependency.
- cost FIPS deployments pay the verification bill twice, at build time and at startup, because the option check and the disable path both changed in the same pull request.
- constraint New API surface arriving at patch level sets a floor: a library that calls MIMEType.parse or STORE-loader key loading has to raise its supported Node range to 24.21.0.
- exposure Failures that used to pass unnoticed now reach application code, so a service that never saw its dgram bind error will start receiving one in the callback it already registered.
A root certificate list decides which server certificates a process will accept. Node's crypto layer carries its own, and 24.21.0 updates it to NSS 3.126 [2]. In the same release the OpenSSL sources go to 3.5.8, with the generated architecture files updated under the same pull request [3]. Two things that determine TLS outcomes moved together, so the check that matters is an outbound handshake to each endpoint the service depends on, run on the new binary.
Three entries share pull request #64982, all credited to Filip Skokan [17]: a check of the FIPS option value in node.gyp [14], handling of malformed OpenSSL macros [15], and a fix for disabling FIPS mode [16]. Two are build-time and one is runtime. A FIPS build therefore needs its own verification pass.
The label SEMVER-MINOR appears six times [11]. Five of those entries are James M Snell's [12]. One is a performance change to net.BlockList [7], and I'd treat a semver-minor tag on a performance change as added surface. The other crypto addition loads private keys through OpenSSL STORE loaders [5].
I would call the histogram work good engineering. The implementation change [6] arrived alongside statistical hypothesis testing on histograms [8] and an --analyze mode for compare.js [10], and those two landed under a single pull request, #65416 [13]. The statistics and the tool that reads them shipped at the same time, so a delta in Node's own benchmark suite can be tested instead of eyeballed.
The smaller entries are where existing code changes behaviour. dgram no longer swallows bind errors when a callback is provided [19]. dns validates the address type in lookupService [20] and the port range in setServers [21], and a crash on setServers with port 0 is fixed [22]. buffer prevents a string write offset overflow [24] and treats detached ArrayBuffers as empty [25].
For the OpenSSL 3.5.8 upgrade the release notes cite a commit hash and a pull request number but never name the defects that version closes [30]. Two more items matter if you build Node yourself. The always-enabled --enable-static flag is now deprecated, which is a strange flag to have been passing [26], and OpenSSL's AVX-512 assembly is enabled under clang [29].
What to watch
- Whether the Node 24 line follows with a release that names security fixes, since this changelog does not tie CVEs to the OpenSSL 3.5.8 upgrade.
- Whether packages that adopt MIMEType.parse or STORE-loader key loading raise their engines floor to 24.21.0.
- Whether the deprecation of the always-enabled --enable-static flag becomes a removal in a later 24.x build.