Files
node/test/parallel/test-https-session-reuse-different-servername.js
Filip Skokan a2ce2c6def tls,tools: update BoringSSL pin and TLS errors
Use BoringSSL 0.20261020.0 for shared-library builds and expose the
package wrapper's version to the matrix updater.

The new verifier no longer emits UNABLE_TO_VERIFY_LEAF_SIGNATURE
after Node's verification callback accepts a missing-issuer error.
Expect UNABLE_TO_GET_ISSUER_CERT_LOCALLY for the affected leaf
certificates and suggest --use-system-ca for that error.

Drop the SSL_get_server_tmp_key() fallback now that BoringSSL supplies
SSL_get_peer_tmp_key() as a compatibility stub.

Refs: https://boringssl-review.googlesource.com/c/boringssl/+/103849
Refs: https://github.com/electron/electron/pull/55110/changes/b457e70e339e8bb3066b210edfb6f96582cdb374
Signed-off-by: Filip Skokan <panva.ip@gmail.com>
Assisted-by: Codex
PR-URL: https://github.com/nodejs/node/pull/66922
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
2026-10-24 22:04:13 +00:00

128 lines
2.8 KiB
JavaScript

'use strict';
const common = require('../common');
if (!common.hasCrypto)
common.skip('missing crypto');
const assert = require('assert');
const fixtures = require('../common/fixtures');
const { untrustedLeafErrorCode } = require('../common/tls');
const https = require('https');
const tls = require('tls');
const { once } = require('events');
function load(name) {
return fixtures.readKey(name);
}
const contexts = {
agent1: tls.createSecureContext({
key: load('agent1-key.pem'),
cert: load('agent1-cert.pem'),
}),
agent3: tls.createSecureContext({
key: load('agent3-key.pem'),
cert: load('agent3-cert.pem'),
}),
};
function request(options) {
return new Promise((resolve, reject) => {
const req = https.get({
...options,
host: '127.0.0.1',
agent: false,
}, (res) => {
res.resume();
res.once('end', () => resolve(res));
});
req.once('error', reject);
});
}
async function requestAndCaptureSession(options) {
let sessionResolve;
const sessionPromise = new Promise((resolve) => {
sessionResolve = resolve;
});
const req = https.get({
...options,
host: '127.0.0.1',
agent: false,
});
req.on('socket', (socket) => {
socket.once('session', sessionResolve);
});
const res = await new Promise((resolve, reject) => {
req.once('response', resolve);
req.once('error', reject);
});
assert.strictEqual(res.socket.authorized, true);
assert.strictEqual(res.socket.isSessionReused(), false);
res.resume();
await once(res, 'end');
const session = await sessionPromise;
assert(session);
return session;
}
const server = https.createServer({
key: load('agent1-key.pem'),
cert: load('agent1-cert.pem'),
minVersion: 'TLSv1.2',
maxVersion: 'TLSv1.2',
SNICallback(servername, cb) {
cb(null, contexts[servername] || contexts.agent1);
},
}, (req, res) => {
res.end('ok');
});
(async function() {
server.listen(0);
await once(server, 'listening');
try {
const session = await requestAndCaptureSession({
port: server.address().port,
servername: 'agent1',
rejectUnauthorized: true,
ca: [load('ca1-cert.pem')],
});
await assert.rejects(
request({
port: server.address().port,
servername: 'agent3',
session,
rejectUnauthorized: true,
ca: [load('ca1-cert.pem')],
}),
{
code: untrustedLeafErrorCode,
},
);
await assert.rejects(
request({
port: server.address().port,
servername: 'agent3',
rejectUnauthorized: true,
ca: [load('ca1-cert.pem')],
}),
{
code: untrustedLeafErrorCode,
},
);
} finally {
server.close();
await once(server, 'close');
}
})().then(common.mustCall());