Version
latest main branch
Platform
Subsystem
crypto
What steps will reproduce the bug?
const { X509Certificate } = require('node:crypto');
const tls = require('node:tls');
const izenpeFingerprint =
'25:30:CC:8E:98:32:15:02:BA:D9:6F:9B:1F:BA:1B:09:' +
'9E:2D:29:9E:0F:45:48:BB:91:4F:36:3B:C0:D4:53:1F';
const found = tls.rootCertificates.some((pem) => {
return new X509Certificate(pem).fingerprint256 === izenpeFingerprint;
});
console.log(tls.rootCertificates.length); // 120
console.log(found); // false
How often does it reproduce? Is there a required condition?
Every
What is the expected behavior? Why is that the expected behavior?
Izenpe.com should remain in the bundled CA store.
Its NSS policy specifies:
CKA_NSS_SERVER_DISTRUST_AFTER = 260415235959Z
Therefore, assuming all other certificate validation succeeds:
- A server certificate with NotBefore <= 2026-04-15 23:59:59Z should remain trusted.
- A server certificate with NotBefore > 2026-04-15 23:59:59Z should be rejected.
The cutoff applies to the end-entity certificate’s issuance time. It does not mean that the entire root must be removed after that date.
Retained roots with a server distrust-after constraint continue to trust post-cutoff certificates because the metadata is discarded during PEM generation.
What do you see instead?
The generated src/node_root_certs.h contains 120 valid PEM certificates, but Izenpe.com is missing.
As a result, TLS server chains anchored to Izenpe fail when Node uses its bundled CA store, including chains whose end-entity certificate was issued before the NSS distrust after cutoff.
The missing root can be detected with:
All existing PEM entries still parse successfully, so a test that only validates PEM syntax does not detect the missing trust anchor.
Additional information
No response
Version
latest main branch
Platform
Subsystem
crypto
What steps will reproduce the bug?
How often does it reproduce? Is there a required condition?
Every
What is the expected behavior? Why is that the expected behavior?
Izenpe.com should remain in the bundled CA store.
Its NSS policy specifies:
CKA_NSS_SERVER_DISTRUST_AFTER = 260415235959Z
Therefore, assuming all other certificate validation succeeds:
The cutoff applies to the end-entity certificate’s issuance time. It does not mean that the entire root must be removed after that date.
Retained roots with a server distrust-after constraint continue to trust post-cutoff certificates because the metadata is discarded during PEM generation.
What do you see instead?
The generated src/node_root_certs.h contains 120 valid PEM certificates, but Izenpe.com is missing.
As a result, TLS server chains anchored to Izenpe fail when Node uses its bundled CA store, including chains whose end-entity certificate was issued before the NSS distrust after cutoff.
The missing root can be detected with:
All existing PEM entries still parse successfully, so a test that only validates PEM syntax does not detect the missing trust anchor.
Additional information
No response