WebSockets как сделать сервер по SSL протоколу WSS://

Рейтинг: 0Ответов: 2Опубликовано: 13.05.2023

Всем привет, пишу websocket сервер, получилось сделать, чтоб сервер работал по ws:// протоколу, но когда я соединяю с фронтом на angular, а сайт работает по https, то он ругается на то, что не может передавать данные по незащищённому протоколу ws:// и нужно использовать wss://, но сервер почему-то не работает на wss://, а только ws://.

Как исправить данную проблему и запустить всё-таки всё по защищённому протоколу?

Код сервака:

 protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $entityManager = $this->container->get('doctrine.orm.entity_manager');
        $jwtManager = $this->container->get('lexik_jwt_authentication.jwt_manager');
        $dotenv = new Dotenv();
        $dotenv->loadEnv(dirname(__DIR__, 2) .'/.env');
        $devMode = $_ENV['DEVMODE'];
        $output->writeln("<fg=gray;options=bold>DEVMODE = {$devMode}</>");


        $loop = Loop::get();

        $server = new SocketServer('0.0.0.0:8080',[
            'local_cert' => '/ssl/cert.pem',
            'local_pk' => '/ssl/key.pem',
            'allow_self_signed' => true,
            'verify_peer' => false
        ]);

        $webServer = new IoServer(
            new HttpServer(
                new WsServer(
                        new Server($entityManager, $jwtManager, $devMode)
                )
            ),
            $server,
            $loop
        );
        $output->writeln('<fg=green;options=bold>Starting WebSocket server on port 8080</>');

        echo $webServer->socket->getAddress() . PHP_EOL;

        $loop->run();


        return Command::SUCCESS;
    }

Ответы

▲ 0Принят

Перешёл с Rathet на Workerman и всё отлично заработало, даже с сертификатом от certbot

код сервака для тех кто не понял:

<?php

use Workerman\Worker;

require dirname(__DIR__,2).'/vendor/autoload.php';

$context = [
    'ssl' => [
        'local_cert'=> '/etc/letsencrypt/live/domain.com/cert.pem',
        'local_pk' => '/etc/letsencrypt/live/domain.com/privkey.pem',
        'verify_peer'  => false,
        'allow_self_signed' => true
    ]
];

// Create a Websocket server with ssl context.
$ws_worker = new Worker("websocket://0.0.0.0:8080", $context);

// Enable SSL. WebSocket+SSL means that Secure WebSocket (wss://).
// The similar approaches for Https etc.
$ws_worker->transport = 'ssl';

// Emitted when new connection come
$ws_worker->onConnect = function($connections)
{
    echo "New connection\n";

};

$ws_worker->onMessage = function($connection, $data)
{
//    $connection->send('Hello WSS!');
    var_dump($data);
};
// Emitted when connection closed
$ws_worker->onClose = function($connection)
{
    echo "Connection closed\n";
};

    Worker::runAll();
▲ 0

сделал на JS (запускаю node sserver.js)

const https = require('https');
const fs = require('fs');
const WebSocket = require('ws');

const server = https.createServer({
cert: fs.readFileSync('C:/Certbot/live/xyz.ru/cert.pem'),
key: fs.readFileSync('C:/Certbot/live/xyz.ru/privkey.pem')
});
    
const wss = new WebSocket.Server({ server });
    
wss.on('connection', function connection(ws) {
console.log('Новое защищенное подключение установлено');
    
ws.on('message', function incoming(message) {
console.log('Получено сообщение:', message);
});
    
console.log('Connected to Secure WebSocket server');
});
    
server.listen(8080, () => {
console.log('Сервер запущен на порту 8080');
});