From 53bef423f31bb383212a6754228c21ca3d3231b6 Mon Sep 17 00:00:00 2001 From: Alba Mendez Date: Sat, 11 May 2019 23:07:06 +0200 Subject: tls: expose keylog event on TLSSocket Exposes SSL_CTX_set_keylog_callback in the form of a `keylog` event that is emitted on clients and servers. This enables easy debugging of TLS connections with i.e. Wireshark, which is a long-requested feature. PR-URL: https://github.com/nodejs/node/pull/27654 Refs: https://github.com/nodejs/node/issues/2363 Reviewed-By: Anna Henningsen Reviewed-By: James M Snell Reviewed-By: Ben Noordhuis Reviewed-By: Sam Roberts Reviewed-By: Rich Trott --- lib/_tls_wrap.js | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) (limited to 'lib/_tls_wrap.js') diff --git a/lib/_tls_wrap.js b/lib/_tls_wrap.js index a04f0014c7..5b86672b95 100644 --- a/lib/_tls_wrap.js +++ b/lib/_tls_wrap.js @@ -286,6 +286,18 @@ function onnewsession(sessionId, session) { } +function onkeylogclient(line) { + debug('client onkeylog'); + this[owner_symbol].emit('keylog', line); +} + +function onkeylog(line) { + debug('server onkeylog'); + const owner = this[owner_symbol]; + if (owner.server) + owner.server.emit('keylog', line, owner); +} + function onocspresponse(resp) { debug('client onocspresponse'); this[owner_symbol].emit('OCSPResponse', resp); @@ -571,6 +583,7 @@ TLSSocket.prototype._init = function(socket, wrap) { ssl.onclienthello = loadSession; ssl.oncertcb = loadSNI; ssl.onnewsession = onnewsession; + ssl.onkeylog = onkeylog; ssl.lastHandshakeTime = 0; ssl.handshakes = 0; @@ -580,6 +593,8 @@ TLSSocket.prototype._init = function(socket, wrap) { // Also starts the client hello parser as a side effect. ssl.enableSessionCallbacks(); } + if (this.server.listenerCount('keylog') > 0) + ssl.enableKeylogCallback(); if (this.server.listenerCount('OCSPRequest') > 0) ssl.enableCertCb(); } @@ -605,9 +620,24 @@ TLSSocket.prototype._init = function(socket, wrap) { ssl.enableSessionCallbacks(); - // Remover this listener since its no longer needed. + // Remove this listener since it's no longer needed. this.removeListener('newListener', newListener); } + + ssl.onkeylog = onkeylogclient; + + // Only call .onkeylog if there is a keylog listener. + this.on('newListener', keylogNewListener); + + function keylogNewListener(event) { + if (event !== 'keylog') + return; + + ssl.enableKeylogCallback(); + + // Remove this listener since it's no longer needed. + this.removeListener('newListener', keylogNewListener); + } } ssl.onerror = onerror; -- cgit v1.2.3