Не удается подключиться к веб-сокету с помощью ssl и apache - PullRequest
5 голосов
/ 23 марта 2019

Я пытаюсь подключить мой клиент к сокету сервера с помощью socket.io. Когда я использую http, все работает нормально, но когда я пытаюсь использовать https, клиент не может подключиться.

Я пытаюсь создать сервер, используя http require ('https') и используя сертификаты, но не работает.

Пока что после нескольких изменений кода и тестирования мой код выглядит так:

Сервер, index.js

var https = require('https');
var app = express();
var options = {
   key: fs.readFileSync('./server-key.pem'), 
   cert: fs.readFileSync('./server-crt.pem'), 
   ca: fs.readFileSync('./ca-crt.pem'), 
   requestCert: false,
   rejectUnauthorized: false
};


var server = https.createServer(options, app);¡
var io = require('socket.io')(server);

server.listen(3003, function() {
        console.log('server up and running at %s port', 3003);
});


io.on('connection', function(client){
        console.log("NUEVO CLIENTE");
        client.on('event', function(data){});
        client.on('disconnect', function(){});
        client.on('setRoom', function(room) {
                        client.room = room;
                        client.join(room);
        });
        client.on('leaveRroom', function(room) {
                        client.leave(room);
    });

});

Соединение с сервером всегда успешно с использованием порта 3003.

Клиент

$scope.socket = io.connect('https://socket.softgym.com/', { transports: ['websocket'],rejectUnauthorized: false});
$scope.socket.on('connect_error', function (data) {
                console.log(data);
    });

    $scope.socket.on('message', function(message) {
        $scope.getAttendance();
        $scope.clientDetails(message.user[0]);
    })

Журналы браузера:

socket.io-client:manager opening https://socket.softgym.com/ +0ms
VM74:6 engine.io-client:socket creating transport "websocket" +5s
VM74:6 engine.io-client:socket setting transport websocket +1ms
VM74:6 socket.io-client:manager connect attempt will timeout after 20000 +4ms
VM74:7 WebSocket connection to 'wss://socket.softgym.com/socket.io/?EIO=3&transport=websocket' failed: Error during WebSocket handshake: Unexpected response code: 500
r.doOpen @ VM74:7
r.open @ VM74:7
r.open @ VM74:6
r @ VM74:6
r @ VM74:6
r.open.r.connect @ VM74:6
(anonymous) @ VM74:6
VM74:6 engine.io-client:socket socket error {"type":"TransportError","description":{"isTrusted":true}} +502ms
VM74:6 socket.io-client:manager connect_error +501ms
VM74:6 socket.io-client:manager cleanup +0ms
access.js:51 Error: websocket error
    at r.onError (eval at <anonymous> (jquery.min.js:2), <anonymous>:7:8015)
    at WebSocket.ws.onerror (eval at <anonymous> (jquery.min.js:2), <anonymous>:7:23668)
VM74:6 socket.io-client:manager reconnect attempt error +1ms
VM74:6 socket.io-client:manager will wait 5000ms before reconnect attempt +1ms
VM74:6 engine.io-client:socket socket close with reason: "transport error" +4ms
VM74:6 socket.io-client:manager attempting reconnect +5s
VM74:6 socket.io-client:manager readyState closed +1ms

Для ssl я использую балансировщик нагрузки для AWS. enter image description here

Это мой сайт apache:

<VirtualHost *:80>
        ServerName socket.softgym.com
        ServerAlias www.socket.softgym.com
        ServerAdmin webmaster@localhost
        RewriteEngine On
        RewriteCond %{REQUEST_URI} ^/socket.io          [NC]
        RewriteCond %{QUERY_STRING} transport=websocket [NC]
        RewriteRule /(.*) wss://localhost:3003/%1        [P,L]

        ProxyPass /socket.io https://localhost:3003/socket.io
        ProxyPassReverse /socket.io https://localhost:3003/socket.io

</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Я ожидаю, что клиент успешно соединится с сервером через https.

1 Ответ

3 голосов
/ 31 марта 2019

Похоже, ваш прокси-сервер не поддерживает обновление WebScokets.Если вы используете apache, настройка не проста.Для этого вам нужно установить модуль mod_proxy_ws_tunnel.

Перейдите по этой ссылке


Обновление веб-сокетов - это процесс, при котором пользователь обновляется с HTTP-протокола до протокола WebSckets, отправляя заголовок обновления с последующей трехсторонней стрелкойтрясти.Вы можете найти некоторые ресурсы о настройке apache с помощью websocket здесь


Также, если сервер apache не требуется, и вы можете использовать другой прокси-сервер.Установите nginx, и ваша жизнь станет проще.Затем просто добавьте эту конфигурацию в вашу конфигурацию nginx.

location ~* \.io {
  .. your configuration

  proxy_pass http://localhost:3000;
  proxy_redirect off;

  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...