【问题标题】:How to configure node.js running on Windows to use multiple SSL certificates with multiple domain names?如何配置在 Windows 上运行的 node.js 以使用具有多个域名的多个 SSL 证书?
【发布时间】:2023-03-20 23:00:01
【问题描述】:

我已经阅读了这个问题和答案:“ 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 文件。

我能够使用这个 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);

但是,如果我有一个多域证书和另一个用于单个域的证书,如何配置 SNICallback 和 getSecureContext 函数以使每个域名都使用正确的证书?

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

我尝试过像这样更改 secureContext 对象:

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

这给了我错误“听 EACCES”。

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

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

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

【问题讨论】:

  • 你看过iisnode吗?

标签: windows node.js ssl https pfx


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 2011-09-04
    • 1970-01-01
    • 2019-01-17
    • 2017-06-18
    • 1970-01-01
    相关资源
    最近更新 更多