Topwo博客
首页
博客
项目
您现在的位置是:
Topwo博客
>>
JavaScript
文章
基于nodejs实现一台服务器多个https域名
发布时间:2022-11-05
作者:Topwo
来源:原创
点击:287
### 本例将实现:nodejs ssl 多域名,即,基于nodejs实现一台服务器多个https域名。 很多情况下,一台服务器只能实现一个https网站,因为ssl是绑定服务器IP的,这是历史的原因造成的。 目前IIS6等服务器软件依然只能实现一台服务器绑定一个域名证书。 接下来,展示如何用nodejs实现一台服务器绑定多个SSL证书,实现一台服务器运行多个https网站。 1、nodejs实现web服务是很简单的,这里不再赘述,比如通过http、express组件,都可以轻松实现。 2、支持ssl,实现一个https网站也很容易,https、express也都可以实现。 3、但要实现一个web支持多个https(SSL),不同的域名对应不同的SSL证书,就不那么容易了。需要用到SNI(Server Name Indication)技术。 小知识: SNI (Server Name Indication)是用来改善服务器与客户端 SSL (Secure Socket Layer)和 TLS (Transport Layer Security) 的一个扩展。主要解决一台服务器只能使用一个证书(一个域名)的缺点,随着服务器对虚拟主机的支持,一个服务器上可以为多个域名提供服务,因此SNI必须得到支持才能满足需求。 下面直接上代码: ```javascript const http = require('https'), httpProxy = require('http-proxy'), fs = require('fs'), tls = require('tls'); // 新建一个代理 Proxy Server 对象 var proxy = httpProxy.createProxyServer({}); const secureContext = { 'www.ty2y.com': tls.createSecureContext({ key: fs.readFileSync('./ssl/www.ty2y.com.key', 'utf8'), cert: fs.readFileSync('./ssl/www.ty2y.com.crt', 'utf8') }), 'www.jshaman.com': tls.createSecureContext({ key: fs.readFileSync('../www.jshaman.com.key', 'utf8'), cert: fs.readFileSync('../www.jshaman.com.pem', 'utf8'), ca: fs.readFileSync('../www.jshaman.com.ca-bundle2', 'utf8'), //这一条是可选的,非必须项 }), }, options = { SNICallback: function(domain, cb) { if (secureContext[domain]) { if (cb) { cb(null, secureContext[domain]); } else { // compatibility for older versions of node return secureContext[domain]; } } else { throw new Error('No keys/certificates for domain requested'); } }, key: fs.readFileSync('./ssl/www.fairysoftware.com.key'), cert: fs.readFileSync('./ssl/www.fairysoftware.com.pem') }; // 在每次请求中,调用 proxy.web(req, res config) 方法进行请求分发 var server = require('https').createServer(options, function(req, res) { // 在这里可以自定义路由分发 var host = req.headers.host, ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; switch (host) { case 'www.woqidege.com': res.writeHead(301, { 'Location': 'http://www.jshaman.com' }); res.end('hi'); break; case 'www.jshaman.com': proxy.web(req, res, { target: 'http://127.0.0.1:81' }); break; case 'www.ty2y.com': proxy.web(req, res, { target: 'http://127.0.0.1:82' }); break; case 'weixintest.ajaxjs.com': proxy.web(req, res, { target: 'http://127.0.0.1:83' }); break; default: // res.writeHead(302, { 'Location': 'https://www.jshaman.com/' }); // res.end(); res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Welcome to my server!'); } }); var port = 443; console.log("listening on port: " + port); server.listen(port); ``` 基于nodejs实现一台服务器多个https域名(多个SSL证书、nodejs ssl 多域名),就是这样啦。
上一篇:
Android终止线程的方法
下一篇:
IDEA 老版本历史版本下载地址