如何配置在Windows上运行的node.js以使用具有多个域名的多个SSL证书?

如何配置在Windows上运行的node.js以使用具有多个域名的多个SSL证书?,windows,node.js,ssl,https,pfx,Windows,Node.js,Ssl,Https,Pfx,我已经通读了这个问题和答案: "... 但它对域和服务器使用.key和.crt文件 在Windows 2008 R2计算机上,我找不到domain1.key、server.key和server.crt文件。相反,我通过从IIS导出SSL证书创建了一个domain1.pfx文件 我能够使用一个PFX文件和一个域成功运行https node.js服务器,如下所示: var fs = require('fs'); var https = require('https'); var crypto = r

我已经通读了这个问题和答案: "... 但它对域和服务器使用.key和.crt文件

在Windows 2008 R2计算机上,我找不到domain1.key、server.key和server.crt文件。相反,我通过从IIS导出SSL证书创建了一个domain1.pfx文件

我能够使用一个PFX文件和一个域成功运行https node.js服务器,如下所示:

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);
var secureContext = {
    'domain1': getSecureContext('domain1'),
    'domain2': getSecureContext('domain2'),
    .
    .
}
但是,如果我有一个多域证书加上一个域的另一个证书,那么如何配置SNICallback和getSecureContext函数以使每个域名使用正确的证书呢

我认为两个PFX文件的服务器证书应该是相同的,因为它们在同一台服务器上,所以我只使用第一个PFX文件(对于domain1)作为服务器证书

我尝试过如下更改secureContext对象:

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);
var secureContext = {
    'domain1': getSecureContext('domain1'),
    'domain2': getSecureContext('domain2'),
    .
    .
}
这给了我一个错误“注意听”

在我的特定情况下,我有两个SSL证书。一个是一个域名的扩展验证证书,第二个是支持五个域名的多域证书

我发现调试EACCES错误非常困难。似乎没有更多关于导致EACCES的原因的详细信息。是我的配置错误吗?证书有问题吗?我知道在运行IIS服务器(而不是node.js服务器)的IIS中使用这些证书时,这些证书可以正常工作在同一台Windows 2008 R2服务器上


我想继续使用纯windows和node.js配置(如果可能,不是nginx、iisnode或任何其他库).

解决了此问题。EACCES错误是因为我没有列出需要使用这两个证书的所有站点。由于我正在测试,我只使用了两个站点名称,但多域证书包括一些其他站点。每个站点需要如下所示列出。否则,一个或多个站点将没有证书关联它导致了EACCES错误

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

你看过iSnode吗?