2016-04-06 42 views
1
ile birden çok sertifika/sanal sunucu

Artık Cody-CMS'de Express + vhost'u kullanarak birden çok ana bilgisayarla nodejs kullandım. Şimdi sanal https sunucuları da dahil etmek istedim.Express

SNICallback çağrıldı, ancak orada bitiyor ... Express uygulamasındaki "exp" hiç çağrılmıyor (basit bir işlevle createServer'da değiştirmese bile - yorumlarda değil). "Site1.com isteği" (veya site2.com) adresini alıyorum, ancak tarayıcıya hiçbir şey iade edilmiyor.

http sunucuları için mükemmel çalışır.

Herhangi bir yardım gelebilir.

"use strict"; 

var express = require("express"); 
var vhost = require("vhost"); 
var fs = require("fs"); 


var app1 = express(); 
app1.all("/", function(req, res) { 
    res.send('Hello World, site #1'); 
}); 

var app2 = express(); 
app2.all("/", function(req, res) { 
    res.send('Hello World, site #2'); 
}); 


////////////////// 
// certificates // 
////////////////// 
var crypto = require('crypto'); 

const site1 = { 
    app: app1, 
    context: crypto.createCredentials({ 
    key: fs.readFileSync('ws.key').toString(), 
    cert: fs.readFileSync('ws.crt').toString() 
    }).context 

}; 
const site2 = { 
    app: app2, 
    context: crypto.createCredentials({ 
    key: fs.readFileSync('ws2.key').toString(), 
    cert: fs.readFileSync('ws2.crt').toString() 
    }).context 
}; 

var sites = { 
    "www.site1.com": site1, 
    "site1.com": site1, 

    "www.site2.com": site2, 
    "site2.com": site2 
}; 

// put (www.)site1/2.com in /etc/hosts to 127.0.0.1 



////////// 
// http // 
////////// 

var exp = express(); 
for (let s in sites) { 
    console.log("http -> " + s); 
    exp.use(vhost(s, sites[s].app)); 
} 

exp.listen(80, function() { 
    console.log("Listening https on port: 80") 
}); 


/////////// 
// https // 
/////////// 

var secureOpts = { 
    SNICallback: function (domain) { 
    console.log('request for: ', domain); 
    return sites[domain].context; 
    }, 
    key: fs.readFileSync('ws.key').toString(), 
    cert: fs.readFileSync('ws.crt').toString() 
}; 


var https = require('https'); 
var httpsServer = https.createServer(secureOpts, exp); 
// var httpsServer = https.createServer(secureOpts, function(req, resp) { resp.send("hello"); }); 

httpsServer.listen(443, function() { 
    console.log("Listening https on port: 443") 
}); 

cevap

1

SNICallback ikinci bir parametre var cb. cb, (error, context) imzasına sahiptir. Ben çalışma örneği yapılmış MSCDEX'ün yardımıyla

var secureOpts = { 
    SNICallback: function(domain, cb) { 
    console.log('request for: ', domain); 
    cb(null, sites[domain].context); 
    }, 
    key: fs.readFileSync('ws.key').toString(), 
    cert: fs.readFileSync('ws.crt').toString() 
}; 
+0

Teşekkürler! mükemmel çalışır. – Johan

+0

Kimlik bilgilerinin olmadığı bir alan adı aldığımda ne yapmalıyım? – Johan

+0

Muhtemelen bir hata nesnesini, örnekte olduğu gibi "null" yerine ilk parametre için "cb" ye geçirebilirsiniz. – mscdex