node.js - Node 。根据访问的 IP 服务提供不同的自签名证书

标签 node.js ssl https certificate

我正在 nodejs 中实现 https 服务器,它应该可以从本地 IP 地址和通过 SSL 的公共(public) IP 地址访问。在文档的帮助下(以及关于 SO 的一些答案),我发现了如何为不同的主机名动态提供不同的证书(使用 SNICallback),但作为文档点,SNICallback 仅适用于主机名而不适用于 IP:

Currently, the only server names supported are DNS hostnames Literal IPv4 and IPv6 addresses are not permitted in "HostName"


下面是一些如何创建服务器的代码:
    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' 访问服务器时,是否有可能提供 certs['intern'] 证书
并在通过公共(public) IP(不是主机名)访问服务器时提供 certs['extern'] 证书?

最佳答案

只有当您的服务器有两个独立的内部和外部网络接口(interface)时才有可能。
第二个参数为httpsServer.listen实际上是绑定(bind)接口(interface)。例如,假设您在 192.168.1.100 有一个“内部”接口(interface),您可以这样做:

  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)
如果服务器没有单独的接口(interface),您可以查看“linux 虚拟接口(interface)”(如果是这种情况,可以查看 windows)

关于node.js - Node 。根据访问的 IP 服务提供不同的自签名证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64065779/

相关文章:

javascript - 如何防止最终用户看到通过浏览器控制台进行的网络调用

java - 如何为我的 REST 应用程序配置 https?

internet-explorer - IE 8 在 ssl 的 CNAME 重定向上抛出错误

node.js - 如何动态地从 Firestore 数组中删除多个元素?

node.js - 如何在单个 Gulpjs 任务中添加已经缩小的文件?

带有或不带有 ssl 证书的 git

c++ - 无法通过 Poco 验证服务器证书

macos - 无法在 Mac OS 上编辑/System/Library/OpenSSL/openssl.cnf 文件(只读)

node.js - mqtt.js 自动关闭连接

c# - ASP.NET、HttpWebRequest 和 "Could not create SSL/TLS secure channel"