首页 > 解决方案 > 如何将 HTTP 流转换为 HTTPS?

问题描述

我的网站通过 HTTPS 在公共主机上运行,​​并连接到在 Raspberry PI 上运行的节点服务器。

在与 PI 相同的网络中还有一个硬件(我们称之为解码器),它通过 TCP 发送数据流。PI 的目的是读取该流并将其发送WebSocket到浏览器。所以目标是在我的网站上输出该流。

现在我遇到了混合内容问题,不知道如何解决。

到目前为止,我所做的是nginx在 PI 上安装了一个网络服务器并安装了 Letsencrypt 证书。两者都运行良好(通过网络浏览器中的普通 https:// 调用进行测试)。

没有SSL的 Websocket 连接也可以正常工作,并且我得到了数据,但使用SSL 将无法正常工作。我想问题是解码器无法处理 SSL。

那么如何将非 SSL 数据流“发送”、“转换”、“隧道”或“代理”到 HTTPS 服务器?

更新

@Jake Holzinger:你是绝对正确的。给定的信息是不够的。对不起!我试图澄清:

  1. nginx是没有任何进一步的修改。所以它是来自安装的配置
  2. 该网站(Angular)做了一个let connection = new WebSocket('wss://domain:port');
  3. 节点服务器如下所示:

    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();
    

我希望这会得到更好的印象。谢谢你的帮助!

标签: node.jssslnginxhttpsmixed-content

解决方案


现在我以不同的方式解决了这个问题。

我没有创建代理服务器节点实现,而是在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;
    }
}

推荐阅读