Skip to content

Instantly share code, notes, and snippets.

@DanH42
Created June 22, 2013 05:53
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 DanH42/5836026 to your computer and use it in GitHub Desktop.
Save DanH42/5836026 to your computer and use it in GitHub Desktop.
var fs = require('fs');
var proxy = require('http-proxy');
var crypto = require("crypto");
var router = {
'domain1.com': "127.0.0.1:8001",
'domain2.com': "127.0.0.1:8002",
'domain3.com': "127.0.0.1:8003",
'domain4.com': "127.0.0.1:8004",
'domain5.com': "127.0.0.1:8005"
};
var certs = {
"domain2.com": {ctx: getCredentialsContext("domain2"), ssl: false},
"domain3.com": {ctx: getCredentialsContext("domain3"), ssl: false},
"domain4.com": {ctx: getCredentialsContext("snakeoil"), ssl: false},
"domain5.com": {ctx: getCredentialsContext("snakeoil"), ssl: true}
};
var https_router = {};
for(var i in certs)
https_router[i] = router[i];
function getCredentialsContext(cer){
if(cer === "snakeoil"){ // This is used as a global self-signed certificate
return crypto.createCredentials({
key: fs.readFileSync("/etc/ssl/private/ssl-cert-snakeoil.key"),
cert: fs.readFileSync("/etc/ssl/certs/ssl-cert-snakeoil.pem")
}).context;
}
return crypto.createCredentials({
key: fs.readFileSync("/etc/ssl/private/server.key"),
cert: fs.readFileSync("/etc/ssl/certs/" + cer + ".crt")
}).context;
}
var options = {
hostnameOnly: true,
enable: {
xforward: true
}
};
var http_options = options;
http_options.router = router;
proxy.createServer(http_options).listen(80, "199.192.201.83");
var https_options = options;
https_options.router = https_router;
https_options.https = {
SNICallback: function(hostname){
return certs[hostname].ctx;
},
cert: fs.readFileSync('/etc/ssl/certs/ssl-cert-snakeoil.pem', 'utf8'), // As far as I can tell, this is served up when SNI fails (old browsers)
key: fs.readFileSync('/etc/ssl/private/ssl-cert-snakeoil.key', 'utf8'),
ca: [fs.readFileSync('/etc/apache2/ssl/ca.pem', 'utf8'), fs.readFileSync('/etc/apache2/ssl/sub.class1.server.ca.pem', 'utf8')]
}
https_options.target = true; // Need to check this per-domain
proxy.createServer(https_options).listen(443, "199.192.201.83");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment