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

How to configure node.js running on Windows to use multiple SSL certificates with multiple domain names?

我已经通读了这个问答:“ Is it Possible to Dynamically Return an SSL Certificate in NodeJS?"...但它为域和服务器使用 .key 和 .crt 文件。

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

我能够成功地 运行 一个 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 运行 在同一个 Windows 2008 R2 服务器上使用 IIS 服务器(而不是 node.js 服务器)时,这些证书可以正常工作。

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

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

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