Как да конфигурирам node.js, работещ на Windows, за да използва множество SSL сертификати с множество имена на домейни?

Прочетох този въпрос и отговора: " Възможно ли е динамично връщане на SSL сертификат в NodeJS?"... но той използва .key и .crt файлове за домейните и сървъра.

На машина с Windows 2008 R2 не мога да намеря файловете domain1.key, server.key и server.crt. Вместо това създадох файл domain1.pfx, като експортирах SSL сертификата от IIS.

Мога успешно да стартирам https node.js сървър, използвайки този един PFX файл с един домейн по следния начин:

var fs = require('fs');
var https = require('https');
var crypto = require('crypto');

function getSecureContext(domain) {
    return crypto.createCredentials({
        pfx:        fs.readFileSync('/path/to/' + domain + '.pfx'),
        passphrase: 'passphrase'
    }).context
}
var secureContext = {
    'domain1': getSecureContext('domain1')
}
var options = {
    SNICallback: function (domain) {
       return (secureContext.hasOwnProperty(domain) ? secureContext[domain] : {});
    },
    pfx: fs.readFileSync('/path/to/domain1.pfx'); // for the server certificate
};
var server = https.createServer(
    options,
    requestListener).listen(443);

Но какво ще стане, ако имам сертификат за множество домейни плюс друг сертификат за един домейн, как функциите SNICallback и getSecureContext ще бъдат конфигурирани така, че всяко име на домейн да използва правилния сертификат?

Мисля, че сертификатът на сървъра трябва да е един и същ и за двата PFX файла, тъй като те са на един и същ сървър, така че използвам само първия PFX файл (за домейн1) като сертификат на сървъра.

Опитах се да променя обекта secureContext по този начин:

var secureContext = {
    'domain1': getSecureContext('domain1'),
    'domain2': getSecureContext('domain2'),
    .
    .
}

Това ми дава грешката „listen EACCES“.

В моята конкретна ситуация имам два SSL сертификата. Единият е сертификат за разширено валидиране за едно име на домейн, а вторият е сертификат за множество домейни, поддържащ пет имена на домейни.

Открих, че е много трудно да отстраня грешката на EACCES. Изглежда, че няма повече подробности за това какво причинява EACCES. Грешна ли е конфигурацията ми, има ли проблем със сертификатите? Знам, че тези сертификати работят правилно, когато ги използвам в IIS, работещ с IIS сървър (вместо node.js сървър) на същия Windows 2008 R2 сървър.

Бих искал да остана с чист windows и node.js конфигурация. (Не nginx, iisnode или други библиотеки, ако е възможно).


person ciso    schedule 17.01.2015    source източник
comment
Гледал ли си iisnode?   -  person Josh C.    schedule 20.01.2015


Отговори (1)


Реших го. Грешката на EACCES се дължи на това, че не съм изброил всички сайтове, които трябва да използват двата сертификата. Тъй като тествах, работех само с две имена на сайтове, но сертификатът за много домейни включва някои други сайтове. Всеки сайт трябва да бъде посочен по-долу. В противен случай един или повече от сайтовете няма да имат сертификат, свързан с него, причинявайки грешката EACCES.

var secureContext = {
    'domain1': getSecureContext('domain1'),
    'domain2': getSecureContext('domain2'),
    'domain3': getSecureContext('domain2'),
    'domain4': getSecureCOntext('domain2')
}
person ciso    schedule 20.01.2015