From edd66d0130714cb0ac4c6038965f15d0bd25cb8a Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Fri, 18 Jul 2025 21:57:53 +0200 Subject: [PATCH] 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. PR-URL: https://github.com/nodejs/node/pull/58822 Reviewed-By: Matteo Collina Reviewed-By: Tim Perry Reviewed-By: Ethan Arrowood --- 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 5fde522dc9a..7be5ee7fb29 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])`