WebSockets как сделать сервер по SSL протоколу WSS://
Всем привет, пишу 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;
}
Ответы (2 шт):
Автор решения: LINQ
→ Ссылка
Перешёл с Rathet на Workerman и всё отлично заработало, даже с сертификатом от certbot
код сервака для тех кто не понял:
<?php
use Workerman\Worker;
require dirname(__DIR__,2).'/vendor/autoload.php';
$context = [
'ssl' => [
'local_cert'=> '/etc/letsencrypt/live/justtable.pp.ua/cert.pem',
'local_pk' => '/etc/letsencrypt/live/justtable.pp.ua/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();
Автор решения: Zемлянин
→ Ссылка
сделал на 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');
});