ssl - how to make websocket secure connection in php socket -
i making chatroom using websockets, working fine when use unencrypted connection, after use certificate doesn't work anymore.
in javascript opening connection websocket server @ serverr.php
this:
var wsuri = "ws://mydomain.com:9002/chat/serverr.php"; websocket1 = new websocket(wsuri);
now know must use wss://
instead of ws://
using:
var wsuri = "wss://mydomain.com:9002/chat/serverr.php"; websocket1 = new websocket(wsuri);
but following error:
websocket connection 'wss://mydomain.com:9002/chat/serverr.php' failed: error in connection establishment: net::err_ssl_protocol_error
but don't know how make wss://
connection. tried modify code following part:
set_time_limit(0); require_once($_server['document_root']."../../../home/username/public_html/config/config.php"); $host = 'ssl://0.0.0.0'; //host $port = '9002'; //port $null = null; //null var // generate certificate $privkey = openssl_pkey_new(); $cert = openssl_csr_new($dn, $privkey); $cert = openssl_csr_sign($cert, null, $privkey, 365); // generate pem file # optionally change passphrase 'comet' whatever want, or leave empty no passphrase $pem_passphrase = 'comet'; $pem = array(); openssl_x509_export($cert, $pem[0]); openssl_pkey_export($privkey, $pem[1], $pem_passphrase); $pem = implode($pem); // save pem file $pemfile = 'server.pem'; file_put_contents($pemfile, $pem); //create tcp/ip sream socket $socket = socket_create(af_inet, sock_stream, sol_tcp); //reuseable port socket_set_option($socket, sol_socket, so_reuseaddr, 1); socket_set_option($socket, sol_socket, 'ssl', 'local_cert', $pemfile); socket_set_option($socket, sol_socket, 'ssl', 'passphrase', $pem_passphrase); socket_set_option($socket, sol_socket, 'ssl', 'allow_self_signed', true); socket_set_option($socket, sol_socket, 'ssl', 'verify_peer', false); //bind socket specified host socket_bind($socket, 0, $port); //the rest of code still unmodified in page serverr.php
code in serverr.php
set_time_limit(0); require_once($_server['document_root']."../../../home/username/public_html/config/config.php"); $host = 'localhost'; //host $port = '9002'; //port $null = null; //null var //create tcp/ip sream socket $socket = socket_create(af_inet, sock_stream, sol_tcp); //reuseable port socket_set_option($socket, sol_socket, so_reuseaddr, 1); //bind socket specified host socket_bind($socket, 0, $port); //listen port socket_listen($socket); perform_handshaking($header, $socket_new, $host, $port); //create & add listning socket list $clients = array($socket); //start endless loop, our script doesn't stop while (true) { //manage multipal connections $changed = $clients; //returns socket resources in $changed array socket_select($changed, $null, $null, 0, 10); //check new socket if (in_array($socket, $changed)) { $socket_new = socket_accept($socket); //accpet new socket $clients[] = $socket_new; //add socket client array $header = socket_read($socket_new, 1024); //read data sent socket perform_handshaking($header, $socket_new, $host, $port); //perform websocket handshake //luam ultimele 15 mesaje start $cerereinitialachat=mysqli_query($conexiune,"select * `chat_messages` order `datesend` desc limit 17"); $obiectinitialchat=null; $obiectobjectcount=0; while ($rezultat=mysqli_fetch_assoc($cerereinitialachat)) { $row=$rezultat; $id; $sender_steamid; $avatar; $sender_name; $message; $datesend; $steamprofile; $color; foreach($row $key=>$value){ if($key=="id"){ $id=$value; } if($key=="sender_steamid"){ $sender_steamid=$value; } if($key=="avatar"){ $avatar=$value; } if($key=="sender_name"){ $sender_name=$value; } if($key=="message"){ $message=$value; } if($key=="datesend"){ $datesend=$value; } if($key=="steamprofile"){ $steamprofile=$value; } if($key=="color"){ $color=$value; } } $obiectinitialchat[$obiectobjectcount]=new stdclass; $obiectinitialchat[$obiectobjectcount]->avatar=$avatar; $obiectinitialchat[$obiectobjectcount]->name=$sender_name; $obiectinitialchat[$obiectobjectcount]->message=$message; $obiectinitialchat[$obiectobjectcount]->datesend=$datesend; $obiectinitialchat[$obiectobjectcount]->steamprofile=$steamprofile; $obiectinitialchat[$obiectobjectcount]->color=$color; $obiectobjectcount=$obiectobjectcount+1; } //luam ultimele 15 mesaje stop $cererenumaruonline=mysqli_query($conexiune,"select * `users` `online`!='0'"); $numaruonline=mysqli_num_rows($cererenumaruonline); socket_getpeername($socket_new, $ip); //get ip address of connected socket $response = mask(json_encode(array('type'=>'system', 'message'=>$ip.' connected', 'uonline'=>$numaruonline, 'lastmessages'=>$obiectinitialchat))); //prepare json data send_message($response); //notify users new connection //make room new socket $found_socket = array_search($socket, $changed); unset($changed[$found_socket]); } //loop through connected sockets foreach ($changed $changed_socket) { //check incomming data while(socket_recv($changed_socket, $buf, 1024, 0) >= 1){ $received_text = unmask($buf); //unmask data $tst_msg = json_decode($received_text); //json decode $user_steamid = esc($conexiune,$tst_msg->steamid); //sender steamid $user_avatar = esc($conexiune,$tst_msg->avatar); //avatar $user_name = esc($conexiune,$tst_msg->name); //sender name $user_message = esc($conexiune,$tst_msg->message); //message text $user_steamprofile = esc($conexiune,$tst_msg->steamprofile); //steamprofile $user_message_date = time(); //message text date $user_message=preg_replace("/\r|\n/", "", $user_message);//scoate enterurile if (ctype_space($user_message)) { //daca e numai spatiii libere(albe) $user_message=preg_replace('/\s+/', "", $user_message);//scoate spatiile albe } $admin; $color="normal"; $raspuns=mysqli_query($conexiune,"select * `users` `steamid`='".$user_steamid."'"); while($rezultat=mysqli_fetch_assoc($raspuns)){ $row=$rezultat; foreach($row $key=>$value){ if($key=="dirijor"){ $admin=$value; } } } if($admin=="yes" || $user_steamid=="76561197997524415"){ $color="red"; } if($user_steamid!="" && $user_steamid!=null && $user_message!="" && $user_message!=null){ mysqli_query($conexiune,"insert `chat_messages` (`sender_steamid`,`avatar`,`sender_name`,`message`,`datesend`,`steamprofile`,`color`) values ('".$user_steamid."','".$user_avatar."','".$user_name."','".$user_message."','".$user_message_date."','".$user_steamprofile."','".$color."')"); //prepare data sent client $response_text = mask(json_encode(array('type'=>'usermsg', 'avatar'=>$user_avatar, 'name'=>$user_name, 'message'=>$user_message, 'datesend'=>$user_message_date, 'steamprofile'=>$user_steamprofile, 'color'=>$color))); send_message($response_text); //send data } break 2; //exist loop } $buf = @socket_read($changed_socket, 1024, php_normal_read); if ($buf === false) { // check disconnected client // remove client $clients array $found_socket = array_search($changed_socket, $clients); socket_getpeername($changed_socket, $ip); unset($clients[$found_socket]); $cererenumaruonline2=mysqli_query($conexiune,"select * `users` `online`!='0'"); $numaruonline2=mysqli_num_rows($cererenumaruonline); $response = mask(json_encode(array('type'=>'upadateusersonline','uonline'=>$numaruonline))); send_message($response); //notify users disconnected connection //$response = mask(json_encode(array('type'=>'system', 'message'=>$ip.' disconnected'))); //send_message($response); } } } // close listening socket socket_close($sock); function send_message($msg) { global $clients; foreach($clients $changed_socket) { @socket_write($changed_socket,$msg,strlen($msg)); } return true; } //unmask incoming framed message function unmask($text) { $length = ord($text[1]) & 127; if($length == 126) { $masks = substr($text, 4, 4); $data = substr($text, 8); } elseif($length == 127) { $masks = substr($text, 10, 4); $data = substr($text, 14); } else { $masks = substr($text, 2, 4); $data = substr($text, 6); } $text = ""; ($i = 0; $i < strlen($data); ++$i) { $text .= $data[$i] ^ $masks[$i%4]; } return $text; } //encode message transfer client. function mask($text) { $b1 = 0x80 | (0x1 & 0x0f); $length = strlen($text); if($length <= 125) $header = pack('cc', $b1, $length); elseif($length > 125 && $length < 65536) $header = pack('ccn', $b1, 126, $length); elseif($length >= 65536) $header = pack('ccnn', $b1, 127, $length); return $header.$text; } //handshake new client. function perform_handshaking($receved_header,$client_conn, $host, $port) { $headers = array(); $lines = preg_split("/\r\n/", $receved_header); foreach($lines $line) { $line = chop($line); if(preg_match('/\a(\s+): (.*)\z/', $line, $matches)) { $headers[$matches[1]] = $matches[2]; } } $seckey = $headers['sec-websocket-key']; $secaccept = base64_encode(pack('h*', sha1($seckey . '258eafa5-e914-47da-95ca-c5ab0dc85b11'))); //hand shaking header $upgrade = "http/1.1 101 web socket protocol handshake\r\n" . "upgrade: websocket\r\n" . "connection: upgrade\r\n" . "websocket-origin: $host\r\n" . "websocket-location: ws://$host/demo/shout.php\r\n". "sec-websocket-accept:$secaccept\r\n\r\n"; socket_write($client_conn,$upgrade,strlen($upgrade)); }
Comments
Post a Comment