Как преобразовать поток HTTP в HTTPS? - PullRequest
0 голосов
/ 26 февраля 2019

Мой веб-сайт работает через HTTPS в общедоступном хостере и подключается к серверу узлов, работающему на Raspberry PI.

В той же сети также есть аппаратное обеспечение (назовем его декодером).с PI, который отправляет поток данных через TCP.Цель PI - прочитать этот поток и отправить его через WebSocket в браузер.Таким образом, цель состоит в том, чтобы вывести этот поток на мой веб-сайт.

Теперь я столкнулся с проблемой содержания миксов и не знаю, как ее решить.

То, что я до сих пор делал, этоустановить веб-сервер nginx на PI и установить сертификат Letsencrypt.Оба работают нормально (проверено с помощью обычного вызова https: // в веб-браузере).

Соединение Websocket без SSL также работает нормально, и я получаю данные, но с SSL не будет работать.Я предполагаю, что проблема в том, что декодер не может обрабатывать SSL.

Так как я могу "отправить", "преобразовать", "туннелировать" или "прокси" поток данных без SSL вHTTPS сервер?

Обновление

@ Джейк Хольцингер: вы абсолютно правы.Данной информации было недостаточно.Сожалею!Я пытаюсь уточнить:

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

Я надеюсь, что это произведет лучшее впечатление.Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 26 февраля 2019

Теперь я решил эту проблему по-другому.

Вместо создания реализации узла прокси-сервера, я создал обратный прокси на уровне веб-сервера 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...