Как настроить 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'),
    .
    .
}

Это дает мне ошибку «слушай 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