Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to setup WebSocket Secure connection with PHP?

I can't find any information about setting up a wss connection in PHP. I have no problem to be connected throw ws. I'm using this pretty great library to do this by the way: https://github.com/albeva/php-websocket

But my website use https and I need a WebSocket Secure connection to avoid Firefox to complain about the fact that the connection is insecure.

Thanks in advance for your help.


Edit

Here is the code used by the library to start the socket connection:

$master = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!is_resource($master)) {
    $this->throwSocketError();
}

// set options
if (!socket_set_option($master, SOL_SOCKET, SO_REUSEADDR, 1)) {
    $this->throwSocketError();
}

// bind
if (!socket_bind($master, $this->host, $this->port)) {
    $this->throwSocketError();
}

// listen for connections
if (!socket_listen($master, SOMAXCONN)) {
    $this->throwSocketError();
}

I believe I need to change this code but I can't find how.

like image 987
Nicolas BADIA Avatar asked May 16 '12 00:05

Nicolas BADIA


Video Answer


2 Answers

Did you try stream_socket_server ?

<?php
$socket = stream_socket_server("ssl://0.0.0.0:".$port, $errno, $errstr);
if (!$socket) {
  echo "$errstr ($errno)<br />\n";
} else {
  while ($conn = stream_socket_accept($socket)) {
    fwrite($conn, 'some data...\n');
    fclose($conn);
  }
  fclose($socket);
}
?>
like image 115
Ramil Amerzyanov Avatar answered Sep 17 '22 20:09

Ramil Amerzyanov


Here is an example (and link), which was modified slightly, and found from another SO post. Link to other post

And here is a link to the stream_context_create php function definition. function definition

try 
{ 
    $localCertificateFilespec = $connection['localCertificateFilespec']; 
    $localCertificatePassphrase = $connection['localCertificatePassphrase']; 

    $sslOptions = array( 
        'ssl' => array( 
            'local_cert' => $localCertificateFilespec, 
            'passphrase' => $localCertificatePassphrase, 
            'allow_self_signed' => true, 
            'verify_peer' => false 
        ) 
    ); 
    $sslContext = stream_context_create($sslOptions); 

    $clientArguments = array( 
        'stream_context' => $sslContext, 
        'local_cert' => $localCertificateFilespec, 
        'passphrase' => $localCertificatePassphrase, 
        'trace' => true, 
        'exceptions' => true, 
        'encoding' => 'UTF-8', 
        'soap_version' => SOAP_1_1 
    ); 

    $oClient = new WSSoapClient($connection['wsdlFilespec'], $clientArguments); 
    $oClient->__setUsernameToken($connection['username'], $connection['password']); 

    return $oClient->__soapCall($operation, $request); 
} 

However, at the very bottom of the linked SO post, you will find an answer from "Sam". I am needing to do this same thing in the next few weeks, so I plan on using Sams method... as I am more of a fan of CURL within PHP.

like image 24
adam Avatar answered Sep 21 '22 20:09

adam