Files
node/test/parallel/test-https-agent-pfx-object-array-reuse.js

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);
});
}