node.js - 如何将 HTTP 流转换为 HTTPS?
问题描述
我的网站通过 HTTPS 在公共主机上运行,并连接到在 Raspberry PI 上运行的节点服务器。
在与 PI 相同的网络中还有一个硬件(我们称之为解码器),它通过 TCP 发送数据流。PI 的目的是读取该流并将其发送WebSocket
到浏览器。所以目标是在我的网站上输出该流。
现在我遇到了混合内容问题,不知道如何解决。
到目前为止,我所做的是nginx
在 PI 上安装了一个网络服务器并安装了 Letsencrypt 证书。两者都运行良好(通过网络浏览器中的普通 https:// 调用进行测试)。
没有SSL的 Websocket 连接也可以正常工作,并且我得到了数据,但使用SSL 将无法正常工作。我想问题是解码器无法处理 SSL。
那么如何将非 SSL 数据流“发送”、“转换”、“隧道”或“代理”到 HTTPS 服务器?
更新
@Jake Holzinger:你是绝对正确的。给定的信息是不够的。对不起!我试图澄清:
nginx
是没有任何进一步的修改。所以它是来自安装的配置- 该网站(Angular)做了一个
let connection = new WebSocket('wss://domain:port');
节点服务器如下所示:
const net = require('net'); const fs = require('fs'); const https = require('https'); const date = require('date-and-time'); const config = require('./server-config.json'); const httpProxy = require('http-proxy'); // SSL SERVER try { const privateKey = fs.readFileSync('/etc/letsencrypt/live/' + config.DNSROUTER + '/privkey.pem', 'utf8'); const certificate = fs.readFileSync('/etc/letsencrypt/live/' + config.DNSROUTER + '/cert.pem', 'utf8'); const ca = fs.readFileSync('/etc/letsencrypt/live/' + config.DNSROUTER + '/chain.pem', 'utf8'); const options = { key: privateKey, cert: certificate, ca: ca }; let proxy = httpProxy.createServer({ target: 'ws://localhost:9030', ssl: { key: privateKey, cert: certificate } }).listen(9031); } catch (e) { console.log("LETSENCRYPT certificates not found! No SSL!"); console.log(e) } /** * server */ let connections = {}; let WebSocketServer = require('ws').Server; // start WS via HTTP const wss1 = new WebSocketServer({port: 9030}); wss1.on('connection', function(ws) { CLIENTS.push(ws); console.log('connection via HTTP'); ws.on('close', function () { console.log('close HTTP!'); CLIENTS = CLIENTS.filter(item => item != ws); }) }) /** * client */ let connect = function() { console.log(now(), 'Starting server...'); const socket = net.createConnection({ port: config.PORT, host: config.HOST }, () => { console.log('Connected to server!'); }) socket.on('connect', () => { console.log(now(), 'Connected to server!'); socket.on('data', data => { sendAll(data); }); }); socket.on('error', data => { console.log(now(), "Connnection refused:", data.errno,data.code,"(IP:", data.address + ":" + data.port + ")"); setTimeout(() => { socket.removeAllListeners(); console.log(now(),"Reconnecting..."); connect(); }, 1000); }); socket.on('end', () => { console.log(now(), 'Disconnected from server'); console.log(now(), "Reconnecting..."); socket.removeAllListeners(); connect(); }); } connect();
我希望这会得到更好的印象。谢谢你的帮助!
解决方案
现在我以不同的方式解决了这个问题。
我没有创建代理服务器节点实现,而是在nginx
网络服务器级别创建了反向代理来代理所有 HTTPS -> HTTP 对 PI 的调用。下面的代码现在对我来说工作正常。
sudo nano /etc/nginx/sites-available/default
并像这样更改内容:
server {
listen 9031 ssl;
ssl_certificate /etc/letsencrypt/live/DOMAIN_DNS/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/DOMAIN_DNS/privkey.pem;
location / {
proxy_pass http://127.0.0.1:9030;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
}
推荐阅读
- java - 覆盖默认 AutowiredAnnotationBeanPostProcessor 以停止 JSR-330 支持
- java - Hql 错误:类未映射,无法解析符号
- mql4 - 我在 ex4 中使用自定义指标编写了一个 EA
- python - 年度数据的两个数据框如何在年份之间找到
- salesforce - DocuSign 短信认证
- java - React Native:是否可以在应用重新加载时保留本机 Java 变量值?
- cassandra - Cassandra:你如何在结果中包含查询?
- php - SilverStripe 4 - 大型资产下载耗尽了 HTTPStreamResponse.php 中的 memory_limit
- xamarin - 如何正确实现 xamarin 表单的位置更改侦听器?
- python - 如何计算神经网络输入的输出梯度?