веб-сокет не работает с SSL и WSS в JavaScript - PullRequest
0 голосов
/ 29 мая 2018

Я реализовал веб-сокет, используя приведенный ниже код,

try {
        console.log('wss://' + hostname + ':' + port + endpoint);
        webSocket = new WebSocket(webSocketURL);
        webSocket.onmessage = function (event) {
            //console.log('send message successfully.');
            var obj = JSON.parse(event.data);
            append_data(obj, market_pair);
        };
    } catch (exception) {
        console.log('Exception handle!');
        console.error(exception);
    }

Моя страница поддерживает https, поэтому я использую протокол wss.но проблема в том, что это дает мне ошибку, что «Firefox не может установить соединение с сервером по адресу wss: //domainname.com: 4008 / order.php», если я загружу страницу, используя простой http и использую ws в websocket, тогдаработает нормально, но с wss это показывает ошибку выше.таким же образом в Google Chrome он также не сможет подключиться.Мой ssl-сертификат правильно установлен на сервере, а мой хостинг и домен предоставлены в godaddy, и мне сказали, что сертификат установлен правильно.

Я использую сокет на стороне сервера в php, и теперь он работает нормально, теперь могу подключитьсяк этому порту сокета с помощью wss: //

Я обнаружил, что не могу выполнить квитирование с использованием своего php-кода, потому что мой php-файл работает в фоновом режиме, а содержимое, которое я получаю при чтении через сокет, зашифровано.

function doHandshake($received_header, $client_socket_resource, $host_name, $port) {
    echo $received_header;
    $headers = array();
    $lines = preg_split("/\r\n/", $received_header);
    foreach ($lines as $line) {
        $line = chop($line);
        if (preg_match('/\A(\S+): (.*)\z/', $line, $matches)) {
            $headers[$matches[1]] = $matches[2];
        }
    }

    $secKey = $headers['Sec-WebSocket-Key'];
    echo $headers['Sec-WebSocket-Key']; 
    $secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
    //$secAccept = base64_encode(sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'));
    $buffer = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
            "Upgrade: websocket\r\n" .
            "Connection: Upgrade\r\n" .
            "WebSocket-Origin: $host_name\r\n" .
            "WebSocket-Location: wss://$host_name:$port/websocket/btc_boon_pair.php\r\n" .
            "Sec-WebSocket-Accept:$secAccept\r\n\r\n";
    socket_write($client_socket_resource, $buffer, strlen($buffer));
}

это моя функция квитирования $ headers ['Sec-WebSocket-Key'] не определена, потому что $ receive_header зашифрован.

Может кто-нибудь предложить решение этой проблемы?Я должен запустить php файл как демон и хочу подключиться по протоколу wss.

1 Ответ

0 голосов
/ 02 июня 2018

Хорошо, наконец, я решил проблему.

из-за шифрования SSL он не может прочитать сокет в моем файле php daemon.Таким образом, я получаю решение снизу: ответ https://serverfault.com/questions/804862/apache-mod-proxy-forward-secure-websocket-to-non-secure

мы можем использовать прокси-пароль в apache, чтобы он отправлял весь запрос с / websocket на другой ws: // host: port /, после этого он работает отлично.

Также убедитесь, что доменное имя не использует прокси, потому что из-за этого мое решение не работает, но после удаления прокси из настроек DNS оно начало работать.

...