我正在nodejs中实现https服务器,它应该可以从本地IP地址访问,也可以从SSL上的公共IP地址访问。借助文档(以及这里对SO的一些答案),我发现了如何动态地为不同的主机名(使用SNICallback)提供不同的证书,但是作为文档点,SNICallback只使用主机名而不是IP:
目前唯一支持的服务器名称是DNS主机名文字IPv4和IPv6地址不允许出现在"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‘访问时提供证书’‘intern’证书,而在公共IP访问服务器(不是主机名)时提供证书‘’extern‘证书?
发布于 2020-09-25 17:55:18
只有当您的服务器有两个独立的内部和外部网络接口时,才有可能。
httpsServer.listen的第二个参数实际上是绑定接口。例如,假设您在192.168.1.100有一个“内部”接口,您可以这样做:
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 )。
https://stackoverflow.com/questions/64065779
复制相似问题