Задать вопрос
@protuberanez

Как заставить работать SSL при работе с websocket сервером на Workerman PHP?

Проблема в одной какой то маленькой детали, но какой конкретно не допираю вообще
есть вебсокет сервер workerman php, код такой, самый простой:
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
$ws_worker = new Worker("websocket://0.0.0.0:2346");

// Указываем путь к SSL сертификату и ключу
$ws_worker->transport = 'ssl';
$ws_worker->ssl = [
    'local_cert' => '/etc/letsencrypt/live/domain.com/fullchain.pem', 
    'local_pk' => '/etc/letsencrypt/live/domain.com/privkey.pem', 
    'verify_peer' => false
];

$ws_worker->onConnect = function($connection) {
    echo "New connection\n";
};
$ws_worker->onMessage = function($connection, $data) {
    // Отправляем обратно то же сообщение
    $connection->send("Received: " . $data);
};

// Устанавливаем обработчик для отключений
$ws_worker->onClose = function($connection) {
    echo "Connection closed\n";
};

// Запускаем сервер
Worker::runAll();


как видно чтоб работало через wss, указал путь к файлам ssl

далее конфиг nginx:
listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

location /ws {
        proxy_pass https://127.0.0.1:2346;  # Порт, на котором работает ваш WebSocket сервер
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }


вебсервак выдает при подключении клиента (const socket = new WebSocket('wss://domain.com/ws')) в терминале:
SSL handshake error: stream_socket_enable_crypto():
SSL_R_NO_SHARED_CIPHER: no suitable shared cipher could be used. This could be because the server is missing a SSL certificate (local_cert context option)

рассматривал так же и решения по такому же вопросу который задавался другими пользователями хабры:
Почему не работает Workerman для wss соединения?
Как настроить Workerman для wss соединения?
- ложил файлы сертификата в корень домена
- повышал привелегии для файлов сертификата
- указывал в инициализации класса воркерамена домен:
$ws_worker = new Worker("websocket://domain.com:2346");

но ошибка всегда одна и та же
  • Вопрос задан
  • 45 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
ky0
@ky0 Куратор тега Nginx
Миллиардер, филантроп, патологический лгун
Зачем вам шифрование на локалхосте? Оставьте в nginx, в РНР это тащить незачем.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы