From bbd77e1d2c8877cc60c88dda476f988471ef8a59 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Sun, 22 Jun 2025 23:48:49 +0200 Subject: [PATCH 1/2] crypto: add tls.setDefaultCACertificates() This API allows dynamically configuring CA certificates that will be used by the Node.js TLS clients by default. Once called, the provided certificates will become the default CA certificate list returned by `tls.getCACertificates('default')` and used by TLS connections that don't specify their own CA certificates. This function only affects the current Node.js thread. --- doc/api/tls.md | 48 +++++ lib/tls.js | 32 +++ src/crypto/crypto_context.cc | 196 ++++++++++++++++-- test/common/tls.js | 32 +++ .../es-modules/custom-condition/load.cjs | 6 + test/fixtures/tls-extra-ca-override.js | 50 +++++ ...t-default-ca-certificates-append-fetch.mjs | 54 +++++ ...lt-ca-certificates-append-https-request.js | 71 +++++++ ...et-default-ca-certificates-array-buffer.js | 39 ++++ ...t-tls-set-default-ca-certificates-basic.js | 58 ++++++ ...t-tls-set-default-ca-certificates-error.js | 41 ++++ ...-default-ca-certificates-extra-override.js | 19 ++ ...set-default-ca-certificates-mixed-types.js | 46 ++++ ...ault-ca-certificates-precedence-bundled.js | 53 +++++ ...efault-ca-certificates-precedence-empty.js | 51 +++++ ...ls-set-default-ca-certificates-recovery.js | 43 ++++ ...et-default-ca-certificates-reset-fetch.mjs | 47 +++++ ...ult-ca-certificates-reset-https-request.js | 62 ++++++ ...fault-ca-certificates-append-system-ca.mjs | 49 +++++ ...efault-ca-certificates-override-system.mjs | 87 ++++++++ ...ult-ca-certificates-system-combinations.js | 58 ++++++ 21 files changed, 1128 insertions(+), 14 deletions(-) create mode 100644 test/fixtures/es-modules/custom-condition/load.cjs create mode 100644 test/fixtures/tls-extra-ca-override.js create mode 100644 test/parallel/test-tls-set-default-ca-certificates-append-fetch.mjs create mode 100644 test/parallel/test-tls-set-default-ca-certificates-append-https-request.js create mode 100644 test/parallel/test-tls-set-default-ca-certificates-array-buffer.js create mode 100644 test/parallel/test-tls-set-default-ca-certificates-basic.js create mode 100644 test/parallel/test-tls-set-default-ca-certificates-error.js create mode 100644 test/parallel/test-tls-set-default-ca-certificates-extra-override.js create mode 100644 test/parallel/test-tls-set-default-ca-certificates-mixed-types.js create mode 100644 test/parallel/test-tls-set-default-ca-certificates-precedence-bundled.js create mode 100644 test/parallel/test-tls-set-default-ca-certificates-precedence-empty.js create mode 100644 test/parallel/test-tls-set-default-ca-certificates-recovery.js create mode 100644 test/parallel/test-tls-set-default-ca-certificates-reset-fetch.mjs create mode 100644 test/parallel/test-tls-set-default-ca-certificates-reset-https-request.js create mode 100644 test/system-ca/test-set-default-ca-certificates-append-system-ca.mjs create mode 100644 test/system-ca/test-set-default-ca-certificates-override-system.mjs create mode 100644 test/system-ca/test-set-default-ca-certificates-system-combinations.js diff --git a/doc/api/tls.md b/doc/api/tls.md index 7e443fb66e5021..0e4fc82ae2724c 100644 --- a/doc/api/tls.md +++ b/doc/api/tls.md @@ -2260,6 +2260,54 @@ openssl pkcs12 -certpbe AES-256-CBC -export -out client-cert.pem \ The server can be tested by connecting to it using the example client from [`tls.connect()`][]. +## `tls.setDefaultCACertificates(certs)` + + + +* `certs` {string\[]|ArrayBufferView\[]} An array of CA certificates in PEM format. + +Sets the default CA certificates used by Node.js TLS clients. If the provided +certificates are parsed successfully, they will become the default CA +certificate list returned by [`tls.getCACertificates()`][] and used +by subsequent TLS connections that don't specify their own CA certificates. +The certificates will be deduplicated before being set as the default. + +This function only affects the current Node.js thread. Previous +sessions cached by the HTTPS agent won't be affected by this change, so +this method should be called before any unwanted cachable TLS connections are +made. + +To use system CA certificates as the default: + +```cjs +const tls = require('node:tls'); +tls.setDefaultCACertificates(tls.getCACertificates('system')); +``` + +```mjs +import tls from 'node:tls'; +tls.setDefaultCACertificates(tls.getCACertificates('system')); +``` + +This function completely replaces the default CA certificate list. To add additional +certificates to the existing defaults, get the current certificates and append to them: + +```cjs +const tls = require('node:tls'); +const currentCerts = tls.getCACertificates('default'); +const additionalCerts = ['-----BEGIN CERTIFICATE-----\n...']; +tls.setDefaultCACertificates([...currentCerts, ...additionalCerts]); +``` + +```mjs +import tls from 'node:tls'; +const currentCerts = tls.getCACertificates('default'); +const additionalCerts = ['-----BEGIN CERTIFICATE-----\n...']; +tls.setDefaultCACertificates([...currentCerts, ...additionalCerts]); +``` + ## `tls.getCACertificates([type])`