mirror of
https://github.com/nodejs/node.git
synced 2026-10-28 18:25:13 +08:00
Signed-off-by: Filip Skokan <panva.ip@gmail.com> PR-URL: https://github.com/nodejs/node/pull/64960 Fixes: https://github.com/nodejs/node/issues/48379 Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Aviv Keller <me@aviv.sh>
97 lines
2.5 KiB
JavaScript
97 lines
2.5 KiB
JavaScript
'use strict';
|
|
|
|
const common = require('../common');
|
|
if (!common.hasCrypto)
|
|
common.skip('missing crypto');
|
|
|
|
const assert = require('assert');
|
|
const https = require('https');
|
|
const { hasFIPS } = require('../common/crypto');
|
|
const fixtures = require('../common/fixtures');
|
|
const fips3 = hasFIPS(3);
|
|
const fips35 = hasFIPS(3, 5);
|
|
|
|
const onRequest = (req, res) => {
|
|
res.end(req.socket.getPeerCertificate().subject.CN);
|
|
};
|
|
const requestHandler = fips3 && !fips35 ?
|
|
common.mustNotCall() :
|
|
common.mustCall(onRequest, fips3 ? 1 : 2);
|
|
|
|
const server = https.createServer({
|
|
key: fixtures.readKey('agent2-key.pem'),
|
|
cert: fixtures.readKey('agent2-cert.pem'),
|
|
requestCert: true,
|
|
rejectUnauthorized: false,
|
|
}, requestHandler);
|
|
|
|
server.listen(0, common.mustCall(async () => {
|
|
const agent = new https.Agent({ keepAlive: true, maxSockets: 1 });
|
|
const port = server.address().port;
|
|
|
|
if (fips3) {
|
|
await assert.rejects(request({
|
|
agent,
|
|
port,
|
|
pfx: [{ buf: fixtures.readKey('agent1.pfx'), passphrase: 'sample' }],
|
|
}, false), { code: 'ERR_CRYPTO_UNSUPPORTED_OPERATION' });
|
|
|
|
if (!fips35) {
|
|
agent.destroy();
|
|
server.close();
|
|
return;
|
|
}
|
|
|
|
const result = await request({
|
|
agent,
|
|
port,
|
|
pfx: [{
|
|
buf: fixtures.readKey('agent1-fips.pfx'),
|
|
passphrase: 'password',
|
|
}],
|
|
});
|
|
assert.strictEqual(result.body, 'agent1');
|
|
assert.strictEqual(result.reusedSocket, false);
|
|
agent.destroy();
|
|
server.close();
|
|
return;
|
|
}
|
|
|
|
const first = await request({
|
|
agent,
|
|
port,
|
|
pfx: [{ buf: fixtures.readKey('agent1.pfx'), passphrase: 'sample' }],
|
|
});
|
|
assert.strictEqual(first.body, 'agent1');
|
|
assert.strictEqual(first.reusedSocket, false);
|
|
|
|
const second = await request({
|
|
agent,
|
|
port,
|
|
pfx: [{ buf: fixtures.readKey('agent10.pfx'), passphrase: 'sample' }],
|
|
});
|
|
assert.strictEqual(second.body, 'agent10.example.com');
|
|
assert.strictEqual(second.reusedSocket, false);
|
|
|
|
agent.destroy();
|
|
server.close();
|
|
}));
|
|
|
|
function request(options, expectResponse = true) {
|
|
return new Promise((resolve, reject) => {
|
|
const onResponse = expectResponse ? common.mustCall((res) => {
|
|
let body = '';
|
|
res.setEncoding('utf8');
|
|
res.on('data', (chunk) => body += chunk);
|
|
res.on('end', common.mustCall(() => {
|
|
resolve({ body, reusedSocket: req.reusedSocket });
|
|
}));
|
|
}) : common.mustNotCall();
|
|
const req = https.get({
|
|
...options,
|
|
rejectUnauthorized: false,
|
|
}, onResponse);
|
|
req.on('error', reject);
|
|
});
|
|
}
|