tested certs issued via greenlock

This commit is contained in:
AJ ONeal 2017-04-05 04:13:03 -04:00
parent 50a4d9360a
commit 81dce2f0a1
3 changed files with 79 additions and 38 deletions

View File

@ -136,27 +136,22 @@ if (!program.secret) {
// TODO letsencrypt // TODO letsencrypt
program.tlsOptions = require('localhost.daplie.com-certificates').merge({}); program.tlsOptions = require('localhost.daplie.com-certificates').merge({});
/*
program.tlsOptions.SNICallback = program.greenlock.SNICallback;
program.middleware = program.greenlock.middleware(function (req, res) {
res.end('Hello, World!');
});
*/
/*
function approveDomains(opts, certs, cb) { function approveDomains(opts, certs, cb) {
// This is where you check your database and associated // This is where you check your database and associated
// email addresses with domains and agreements and such // email addresses with domains and agreements and such
// The domains being approved for the first time are listed in opts.domains // The domains being approved for the first time are listed in opts.domains
// Certs being renewed are listed in certs.altnames // Certs being renewed are listed in certs.altnames
if (certs) { if (certs) {
opts.domains = certs.altnames; opts.domains = certs.altnames;
} }
else { else {
if (-1 !== program.servernames.indexOf(opts.domain)) {
opts.email = program.email; opts.email = program.email;
opts.agreeTos = program.agreeTos; opts.agreeTos = program.agreeTos;
} }
}
// NOTE: you can also change other options such as `challengeType` and `challenge` // NOTE: you can also change other options such as `challengeType` and `challenge`
// opts.challengeType = 'http-01'; // opts.challengeType = 'http-01';
@ -165,10 +160,16 @@ function approveDomains(opts, certs, cb) {
cb(null, { options: opts, certs: certs }); cb(null, { options: opts, certs: certs });
} }
if (!program.email || !program.agreeTos) {
console.error("You didn't specify --email <EMAIL> and --agree-tos");
console.error("(required for ACME / Let's Encrypt / Greenlock TLS/SSL certs)");
console.error("");
process.exit(1);
}
program.greenlock = greenlock.create({ program.greenlock = greenlock.create({
server: 'staging' //server: 'staging'
// server: 'https://acme-v01.api.letsencrypt.org/directory' server: 'https://acme-v01.api.letsencrypt.org/directory'
, challenges: { , challenges: {
// TODO dns-01 // TODO dns-01
@ -181,8 +182,15 @@ program.greenlock = greenlock.create({
, agreeTos: program.agreeTos , agreeTos: program.agreeTos
, approveDomains: program.servernames // approveDomains , approveDomains: approveDomains
//, approvedDomains: program.servernames
});
//program.tlsOptions.SNICallback = program.greenlock.SNICallback;
/*
program.middleware = program.greenlock.middleware(function (req, res) {
res.end('Hello, World!');
}); });
*/ */

View File

@ -6,37 +6,43 @@ var packerStream = require('tunnel-packer').Stream;
var redirectHttps = require('redirect-https')(); var redirectHttps = require('redirect-https')();
module.exports.create = function (program) { module.exports.create = function (program) {
program.httpServer = http.createServer(function (req, res) { var tunnelAdminTlsOpts = {};
console.log('req.socket.encrypted', req.socket.encrypted);
res.end("Look! I can do a thing!");
});
program.httpInsecureServer = http.createServer(function (req, res) { // Probably a reverse proxy on an internal network
program.httpServer = http.createServer(program.greenlock.middleware(function (req, res) {
console.log('req.socket.encrypted', req.socket.encrypted);
res.statusCode = 404;
res.end("File not found.\n");
}));
program.handleHttp = function (servername, socket) {
console.log("handleHttp('" + servername + "', socket)");
socket.__my_servername = servername;
program.httpServer.emit('connection', socket);
};
// Probably something that needs to be redirected to https
program.httpInsecureServer = http.createServer(program.greenlock.middleware(function (req, res) {
res.setHeader('Connection', 'close'); res.setHeader('Connection', 'close');
redirectHttps(req, res); redirectHttps(req, res);
}); }));
program.httpTunnelServer = http.createServer(function (req, res) { program.handleInsecureHttp = function (servername, socket) {
console.log('req.socket.encrypted', req.socket.encrypted); console.log("handleInsecureHttp('" + servername + "', socket)");
res.end('Hello, World!'); socket.__my_servername = servername;
}); program.httpInsecureServer.emit('connection', socket);
};
//
// SNI is not recogonized / cannot be handled
//
program.httpInvalidSniServer = http.createServer(function (req, res) { program.httpInvalidSniServer = http.createServer(function (req, res) {
res.end("You're doing strange things that make me feel uncomfortable. Please don't touch me there any more."); res.end("You're doing strange things that make me feel uncomfortable. Please don't touch me there any more.");
}); });
program.tlsTunnelServer = tls.createServer(program.tlsOptions, function (tlsSocket) {
console.log('tls connection');
// things get a little messed up here
(program.httpTunnelServer || program.httpServer).emit('connection', tlsSocket);
});
program.tlsInvalidSniServer = tls.createServer(program.tlsOptions, function (tlsSocket) { program.tlsInvalidSniServer = tls.createServer(program.tlsOptions, function (tlsSocket) {
console.log('tls connection'); console.log('tls connection');
// things get a little messed up here // things get a little messed up here
program.httpInvalidSniServer.emit('connection', tlsSocket); program.httpInvalidSniServer.emit('connection', tlsSocket);
}); });
program.handleInsecureHttp = function (servername, socket) {
console.log("handleInsecureHttp('" + servername + "', socket)");
socket.__my_servername = servername;
program.httpInsecureServer.emit('connection', socket);
};
program.httpsInvalid = function (servername, socket) { program.httpsInvalid = function (servername, socket) {
// none of these methods work: // none of these methods work:
// httpsServer.emit('connection', socket); // this didn't work // httpsServer.emit('connection', socket); // this didn't work
@ -57,6 +63,26 @@ module.exports.create = function (program) {
console.error(err); console.error(err);
}); });
}; };
//
// To ADMIN / CONTROL PANEL of the Tunnel Server Itself
//
program.httpTunnelServer = http.createServer(function (req, res) {
console.log('req.socket.encrypted', req.socket.encrypted);
res.end('Hello, World!');
});
Object.keys(program.tlsOptions).forEach(function (key) {
tunnelAdminTlsOpts[key] = program.tlsOptions[key];
});
tunnelAdminTlsOpts.SNICallback = (program.greenlock && program.greenlock.httpsOptions && function (servername, cb) {
console.log("time to handle '" + servername + "'");
program.greenlock.httpsOptions.SNICallback(servername, cb);
}) || tunnelAdminTlsOpts.SNICallback;
program.tlsTunnelServer = tls.createServer(tunnelAdminTlsOpts, function (tlsSocket) {
console.log('tls connection');
// things get a little messed up here
(program.httpTunnelServer || program.httpServer).emit('connection', tlsSocket);
});
program.httpsTunnel = function (servername, socket) { program.httpsTunnel = function (servername, socket) {
// none of these methods work: // none of these methods work:
// httpsServer.emit('connection', socket); // this didn't work // httpsServer.emit('connection', socket); // this didn't work
@ -65,7 +91,7 @@ module.exports.create = function (program) {
var myDuplex = packerStream.create(socket); var myDuplex = packerStream.create(socket);
console.log('httpsTunnel servername', servername); console.log('httpsTunnel (Admin) servername', servername);
program.tlsTunnelServer.emit('connection', myDuplex); program.tlsTunnelServer.emit('connection', myDuplex);
socket.on('data', function (chunk) { socket.on('data', function (chunk) {
@ -73,7 +99,7 @@ module.exports.create = function (program) {
myDuplex.push(chunk); myDuplex.push(chunk);
}); });
socket.on('error', function (err) { socket.on('error', function (err) {
console.error('[error] httpsTunnel TODO close'); console.error('[error] httpsTunnel (Admin) TODO close');
console.error(err); console.error(err);
}); });
}; };

View File

@ -307,13 +307,20 @@ module.exports.create = function (copts) {
var nextDevice; var nextDevice;
if (-1 !== copts.servernames.indexOf(servername)) { if (-1 !== copts.servernames.indexOf(servername)) {
console.log("Lock and load, admin interface time!");
copts.httpsTunnel(servername, browser); copts.httpsTunnel(servername, browser);
return; return;
} }
if (!servername) {
console.log("No SNI was given, so there's nothing we can do here");
copts.httpsInvalid(servername, browser);
return;
}
nextDevice = Devices.next(deviceLists, servername); nextDevice = Devices.next(deviceLists, servername);
if (!servername || !nextDevice) { if (!nextDevice) {
console.log('this is a server or an unknown'); console.log("No devices match the given servername");
copts.httpsInvalid(servername, browser); copts.httpsInvalid(servername, browser);
return; return;
} }
@ -347,7 +354,7 @@ module.exports.create = function (copts) {
pipeWs(servername, service, browser, Devices.next(deviceLists, servername)); pipeWs(servername, service, browser, Devices.next(deviceLists, servername));
return; return;
} }
copts.handleInsecureHttp(servername, browser); copts.handleHttp(servername, browser);
} }
else { else {
// redirect to https // redirect to https