node.js我可以为同一个项目使用多个ssl证书和密钥吗?

时间:2019-08-17 20:05:21

标签: node.js express ssl

我为我的代码添加了paypal ssl certificate for paypal ipn,它可以正常工作

var httpsOptions = {
    key: fs.readFileSync('./app/certsandkeys/my-prvkey.pem'),
    cert: fs.readFileSync('./app/certsandkeys/my-pubcert.pem'),
    requestCert: true
    //pfx: fs.readFileSync('./app/certsandkeys/ssl/crt.pfx'),
    //passphrase:"password"
}

https.createServer(httpsOptions, app).listen(443,function (req,res) {
    console.log("server listening on port " + 443);
});

但是我现在需要认证我的整个站点,因此我使用openssl(server.crt和server.csr和server.key)创建了一个ssl证书和密钥,但是现在我不知道如何在贝宝ipn证书和httpsOptions上的密钥

我发现的唯一类似内容是github issues

中的这段代码
var options = {
    key: [key1, key2],
    cert: [cert1, cert2],
    ca: caCert
};
var server = https.createServer(options);

那么正确的做法是什么?

2 个答案:

答案 0 :(得分:2)

在同一服务器上使用不同的密钥由服务器名称指示(SNI)处理,并且对于不同的服务器需要不同的域名。 This question显示了如何使用SNI为第二个域名创建不同的安全上下文。

在默认上下文中更改该键的代码应如下所示:

const secondContext = tls.createSecureContext({
    key: [key2],
    cert: [cert2]
});


const options = {
    key: [key1],
    cert: [cert1],
    SNICallback: function (domain, cb) {
      if (domain === 'key2domain.example.com') {
         cb(null, secondContext);
      } else {
         cb();
      }
    }
}

从所指的贝宝文档中尚不清楚贝宝是否正在为该IPN服务URL设置备用域。取而代之的是,他们的流程似乎接受了CSR来处理仅用于IPN的自签名证书,并提供对其进行付费签名以将其用于用户可见的按钮,即他们提供了自己的CA服务?

您可以在同一密钥上提交多个CSR,因此您可以尝试依靠单个私钥并保持普通CA的证书链。但是,如果他们强制使用自己的证书链,那么您可能需要为此创建一个单独的(子)域,以为SNI提供不同的链。

答案 1 :(得分:1)

根据我的观点,正确的做法是为其他实例创建单独的服务器实例。 每个实例将用于单独的证书。

希望它会对您有所帮助。

相关问题