Skip to content

Commit c39498d

Browse files
authored
Add optional ca fallback to tls.rootCertificates (#238)
1 parent 23a73cf commit c39498d

2 files changed

Lines changed: 52 additions & 0 deletions

File tree

lib/protocol/tcp.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ exports.connect = function connect(options, cb) {
2828
if (!('servername' in options)) {
2929
options.servername = options.host;
3030
}
31+
if (!('sslUseDefaultTrustStore' in options) || (options.sslUseDefaultTrustStore === true)) {
32+
if ('ca' in options) {
33+
options.ca = [].concat(options.ca, tls.rootCertificates);
34+
}
35+
}
3136
} else {
3237
createSocket = exports.createSocket;
3338
}

test/lib.tcp.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
'use strict';
1515

1616
var tcp = require('../lib/protocol/tcp');
17+
var tls = require('tls');
1718
var createSocket = tcp.createSocket;
1819
var createSecureSocket = tcp.createSecureSocket;
1920
var socket = {
@@ -66,5 +67,51 @@ describe('Lib', function () {
6667
tcp.connect({}, done).should.equal(socket);
6768
});
6869

70+
it('should fallback to default trusted CAs', function (done) {
71+
var testCase = 0;
72+
tcp.createSecureSocket = function tlsConnect(options, cb) {
73+
switch (testCase) {
74+
case 0:
75+
(options.ca === undefined).should.equal(true);
76+
break;
77+
case 1:
78+
options.ca[0].should.equal("DummyCert");
79+
options.ca.length.should.equal(tls.rootCertificates.length + 1);
80+
for(var i = 0; i < tls.rootCertificates.length; ++i) {
81+
options.ca[i+1].should.equal(tls.rootCertificates[i]);
82+
}
83+
break;
84+
case 2:
85+
options.ca[0].should.equal("DummyCert");
86+
options.ca[1].should.equal("DummyCert2");
87+
options.ca.length.should.equal(tls.rootCertificates.length + 2);
88+
for(var i = 0; i < tls.rootCertificates.length; ++i) {
89+
options.ca[i+2].should.equal(tls.rootCertificates[i]);
90+
}
91+
break;
92+
case 3:
93+
options.ca.should.equal("DummyCert");
94+
break;
95+
default:
96+
break;
97+
}
98+
process.nextTick(cb);
99+
return socket;
100+
}
101+
tcp.connect({useTLS: true}, () => {
102+
++testCase; // 1
103+
tcp.connect({ca: "DummyCert"}, () => {
104+
++testCase; // 2
105+
tcp.connect({ca: ["DummyCert", "DummyCert2"], sslUseDefaultTrustStore: true}, () => {
106+
++testCase; // 3
107+
tcp.connect({ca: "DummyCert", sslUseDefaultTrustStore: false}, () => {
108+
tcp.createSecureSocket = createSecureSocket;
109+
done();
110+
}).should.equal(socket);
111+
}).should.equal(socket);
112+
}).should.equal(socket);
113+
});
114+
});
115+
69116
});
70117
});

0 commit comments

Comments
 (0)