2016-04-06 8 views
1

Cody-CMSでExpress + vhostを使用して、複数のホストでしばらくnodejを使用しました。今、私は仮想httpsサーバも含めたかったのです。Expressで複数の証明書/仮想ホスト

SNICallbackは呼び出されますが、そこでは終了します...私のExpressアプリケーション "exp"は決して呼び出されません(単純な関数でcreateServerに置き換えてもコメントにはなりません)。私は "site1.com"(またはsite2.com)のリクエストを受け取りますが、何もブラウザに返されません。

httpサーバーの場合は、完全に機能します。

助けを歓迎します。 cb

"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の署名は(error, context)です。私は作業例を作ったMSCDEXの助けを借りて

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

この例のように、 'null'ではなく最初のパラメータの' cb'にエラーオブジェクトを渡すことができます。 – mscdex

関連する問題