2016-04-06 3 views
1

Я использовал nodejs некоторое время с несколькими хостами, используя Express + vhost в Cody-CMS. Теперь я хотел включить также виртуальные https-серверы.несколько сертификатов/vhosts с Express

SNICallback вызывается, но он заканчивается там ... мое приложение-приложение «exp» никогда не вызывается (даже если я заменяю его в createServer простой функцией - в комментариях). Я получаю «запрос для: site1.com» (или site2.com), но ничего не возвращается в браузер.

Для http-серверов он работает идеально.

Любая помощь приветствуется.

"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") 
}); 

ответ

1

SNICallback имеет второй параметр: cb. cb имеет подпись (error, context). Так что ваш secureOpts должен выглядеть следующим образом:

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

Спасибо! работает отлично. – Johan

+0

Любой совет, что я должен делать, когда получаю домен, для которого у меня нет учетных данных? – Johan

+0

Возможно, вы можете передать объект ошибки 'cb' для первого параметра вместо' null', как в примере. – mscdex

Смежные вопросы