首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nodejs.根据访问IP服务的不同,提供不同的自签名证书。

Nodejs.根据访问IP服务的不同,提供不同的自签名证书。
EN

Stack Overflow用户
提问于 2020-09-25 14:09:19
回答 1查看 192关注 0票数 1

我正在nodejs中实现https服务器,它应该可以从本地IP地址访问,也可以从SSL上的公共IP地址访问。借助文档(以及这里对SO的一些答案),我发现了如何动态地为不同的主机名(使用SNICallback)提供不同的证书,但是作为文档点,SNICallback只使用主机名而不是IP:

目前唯一支持的服务器名称是DNS主机名文字IPv4和IPv6地址不允许出现在"HostName“中。

下面是创建服务器的一些代码:

代码语言:javascript
复制
    var certs = {
    'intern': {
      key: fs.readFileSync(keyName, 'utf8'),
      cert: fs.readFileSync(certName, 'utf8')
    },
    'extern': {
      key: fs.readFileSync(keyNameExternal, 'utf8'),
      cert: fs.readFileSync(certNameExternal, 'utf8')
    }
  }


  var httpsOpts = {
    SNICallback: function (hostname, cb) {
      if (hostname === 'mydomain.com') {
        var ctx = tls.createSecureContext(certs['extern'])
        cb(null, ctx)
      } 
    },
    key: fs.readFileSync(keyName, 'utf8'),
    cert: fs.readFileSync(certName, 'utf8')
  }

  httpsServer = https.createServer(httpsOpts, httpsApp)
  httpsServer.listen(443, '0.0.0.0', onlisteningHttps)

是否有可能在服务器被本地IP '192.168.1.100‘访问时提供证书’‘intern’证书,而在公共IP访问服务器(不是主机名)时提供证书‘’extern‘证书?

EN

回答 1

Stack Overflow用户

发布于 2020-09-25 17:55:18

只有当您的服务器有两个独立的内部和外部网络接口时,才有可能。

httpsServer.listen的第二个参数实际上是绑定接口。例如,假设您在192.168.1.100有一个“内部”接口,您可以这样做:

代码语言:javascript
复制
  httpsServerInt = https.createServer(certs.intern, httpsApp)
  httpsServerExt = https.createServer(certs.extern, httpsApp)
  httpsServerInt.listen(443, '192.168.1.100', onlisteningHttps)
  httpsServerExt.listen(443, '0.0.0.0', onlisteningHttps)

如果服务器没有单独的接口,您可以查看"linux虚拟接口“(如果是这样的话,可以查看windows )。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64065779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档