Skip to content

Instantly share code, notes, and snippets.

@bajtos
Last active December 19, 2015 18:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bajtos/6000596 to your computer and use it in GitHub Desktop.
Save bajtos/6000596 to your computer and use it in GitHub Desktop.
// Set this to the directory where you have node sources
// The test uses node's test certificates for the TLS server
var PATH_TO_NODE_SOURCES = '/Users/bajtos/src/node';
/** Usage **
1. Start a SSL server in terminal 1
$ openssl s_server -cert test_cert.pem -key test_key.pem
(..lots of SSL logs..)
2. Run the client in terminal 2 - don't reuse sessions
$ node client.js
session reused: false
3. Run the client again and reuse sessions
$ node client.js reuse
session reused: true
*/
// IMPLEMENTATION
var fs = require('fs');
var path = require('path');
var tls = require('tls');
var cert_dir = path.resolve(PATH_TO_NODE_SOURCES, 'test', 'fixtures');
var reuse = process.argv.some(function(a) { return a === 'reuse'; });
function makeConnections(num, session) {
var opts = {
port: 4433,
ca: [ fs.readFileSync(cert_dir + '/test_ca.pem') ],
};
if (reuse)
opts.session = session;
var conn = tls.connect(opts, function() {
conn.end();
if (num > 1) {
makeConnections(num-1, conn.getSession());
} else {
console.log('session reused:', conn.isSessionReused());
}
});
}
makeConnections(2);
// Set this to the directory where you have node sources
// The test uses node's test certificates for the TLS server
var PATH_TO_NODE_SOURCES = '/Users/bajtos/src/node';
// Set to 'SSLv3_method' to enable session resumption
var SECURE_PROTOCOL;// = 'SSLv3_method';
// IMPLEMENTATION
var fs = require('fs');
var path = require('path');
var tls = require('tls');
var cert_dir = path.resolve(PATH_TO_NODE_SOURCES, 'test', 'fixtures');
var options = {
key: fs.readFileSync(cert_dir + '/test_key.pem'),
cert: fs.readFileSync(cert_dir + '/test_cert.pem'),
ca: [ fs.readFileSync(cert_dir + '/test_ca.pem') ]
};
var port;
var sessionSaved = false;
var sessionResumed = false;
server = tls.createServer(options, onConnection);
server.on('newSession', saveSession);
server.on('resumeSession', resumeSession);
server.listen(0, onListening);
var sessionStore = {};
function saveSession(id, data) {
sessionStore[id] = data;
sessionSaved = true;
}
function resumeSession(id, cb) {
var data = sessionStore[id] || null;
sessionResumed = !!data;
cb(null, data);
}
function onListening(addr) {
port = server.address().port;
makeConnections(2);
}
function onConnection(c) {
c.end();
}
function makeConnections(num, session) {
var opts = {
port: port,
ca: [ fs.readFileSync(cert_dir + '/test_ca.pem') ],
secureProtocol: SECURE_PROTOCOL,
session: session
};
var conn = tls.connect(opts, function() {
conn.end();
if (num > 1) {
makeConnections(num-1, conn.getSession());
} else {
console.log('session saved: %s resumed: %s', sessionSaved, sessionResumed);
server.close();
}
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment