2016-10-25 2 views
0

В настоящее время я работаю над службой уведомления в реальном времени, используя websocket, используя TLS/SSL (wss: //).
У меня есть проблема для установления связи между браузером и сервером. Все работает отлично с сервером и клиентом в php, но когда я использую веб-узел JS для подключения к серверу, он терпит неудачу, потому что Я не знаю, как обращаться с рукопожатием на стороне сервера (из браузера).

Пока мой код для сервера:SSL websocket в php/javascript

$host = '127.0.0.1'; 
$port = '9000'; 
$null = NULL; 

$context = stream_context_create(); 

// local_cert must be in PEM format 
stream_context_set_option($context, 'ssl', 'local_cert', "cert.pem"); 
stream_context_set_option($context, 'ssl', 'local_pk', "key.pem"); 
// Pass Phrase (password) of private key 
stream_context_set_option($context, 'ssl', 'passphrase', "test"); 
stream_context_set_option($context, 'ssl', 'allow_self_signed', true); 
stream_context_set_option($context, 'ssl', 'verify_peer', false); 

// Create the server socket 
$server = stream_socket_server('ssl://' . $host . ':' . $port, $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $context); 

if ($server == false) { 
    die ("Could no create the server."); 
} 

//start endless loop 

while (true) { 
    $buffer = ''; 
    print "waiting..."; 
    $client = stream_socket_accept($server); 
    var_dump($client); 
    print "accepted " . stream_socket_get_name($client, true) . "\n"; 
    if ($client) { 
     stream_set_blocking($client, true); 
     // TODO : handshaking 
     stream_set_blocking($client, false); 

     // Respond to php client (test only) 
     /*fwrite($client, "200 OK HTTP/1.1\r\n" 
      . "Connection: close\r\n" 
      . "Content-Type: text/html\r\n" 
      . "\r\n" 
      . "Hello World!"); 
     fclose($client);*/ 
    } else { 
     print "error.\n"; 
    } 
} 

Ничего не говорится о SSL рукопожатия на RFC WebSocket.
Если у кого-то есть идея о том, как реализовать рукопожатие, было бы весьма полезно.

ответ

1

Ничего не говорится об установлении SSL-связи на RFC WebSocket.

wss:// просто ws:// внутри соединения SSL, так же, как HTTPS только HTTP внутри соединения SSL. Нет ничего особенного, т. Е. Вам просто нужно поговорить с протоколом WebSocket по потоку SSL после успешного подтверждения SSL.

+0

Я вижу, спасибо за разъяснение. Однако из Википедии, сервер возвращает 'HTTP/1.1 101 Импульсные Протоколы Обновление: WebSocket соединения: Обновление втор-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk = втор-WebSocket-Protocol: chat' это для' WS: // 'сокет , не должен ли я возвращать что-то другое для 'wss: //' websocket? –

+0

@AlexandreChambet: нет, отправка запроса для обновления такая же, и ответ такой же. Единственное различие заключается в том, что один обменивается данными по простому TCP-соединению, а другой - по потоку SSL. Точно так же, как с HTTP против HTTPS. –

+0

Спасибо, я подумаю об этом. –

Смежные вопросы