GVKun编程网logo

使用Secure Websocket和PHP – 加密握手(websocket数据加密)

3

在本文中,我们将为您详细介绍使用SecureWebsocket和PHP–加密握手的相关知识,并且为您解答关于websocket数据加密的疑问,此外,我们还会提供一些关于html5-本质就是websoc

在本文中,我们将为您详细介绍使用Secure Websocket和PHP – 加密握手的相关知识,并且为您解答关于websocket数据加密的疑问,此外,我们还会提供一些关于html5 - 本质就是websocket的客户端,php Websocket 怎么接收数据、HTML5 websockets与PHP websockets vs node.js websockets?、IE11 对 websocket 报 SecurityError 问题、javascript – WebSocket握手期间出错:PHP的’Sec-WebSocket-Accept’标头值不正确的有用信息。

本文目录一览:

使用Secure Websocket和PHP – 加密握手(websocket数据加密)

使用Secure Websocket和PHP – 加密握手(websocket数据加密)

我读过(安全)Websocket正在使用与HTTP(S)协议相同的端口.
但是,我的PHP Websocket服务器从客户端接收加密的握手,我正在收听12345端口上的开放连接.

我的系统通过非安全websocket很好地工作,但我需要添加安全功能,我不明白为什么我会收到这些加密的握手.由于OSI模型,它对我来说是透明的……

如果我配置apache来激活SSL引擎并监听12345端口.我不能再为我的PHP Websocket服务器使用这个端口,因为它将处于“已经使用过”的状态……或者我忘记了一些东西……

我迷路了 :(

编辑:

这是我的安全websocket标头(使用wss://):

请求网址:wss:// localhost:12345 /

在这里我的简单websocket标头(使用ws://):

请求网址:ws:// localhost:12345 /
请求方法:GET
状态代码:101切换协议
请求Headersview源
连接方式:升级
主持人:本地主机:12345
产地:HTTP://本地主机
仲的WebSocket的扩展:X-WebKit的放气框架
Sec-WebSocket-Key:wovBDvKiKdy / 0Y2BQPr9w ==
仲的WebSocket-版本:13
升级:网页套接字
(密钥3):00:00:00:00:00:00:00:00
响应标题来源
连接方式:升级
仲的WebSocket-接受:1ao7ngQG4LAa3JxFibyvoocbSAM =
升级:网页套接字
(挑战回复):00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00

为什么没有安全连接我会得到更多?

解决方法:

I read that (secure) Websocket are using the same ports that the HTTP(S) protocol

默认情况下,是 – 但您可以通过URL覆盖端口,请考虑:

http://www.example.com:443/
https://www.example.com:8080/
http://www.example.com:12345/

如果其他东西已经在某个特定的端口/地址上侦听,那么你就无法在那里运行第二个服务器 – 所以如果你的网络服务器已经在端口443(https)上监听,你将无法在其上运行一个单独的websocket服务器.同一个港口.

只需将您的HTTPS服务器留在443,然后在12345运行ssl ws服务器.

刚刚看到你的最后评论.

SSL不仅仅是关于您监听的端口 – 流量是加密的.如果你想处理wss流量,那么你需要一个支持SSL的服务器.有多种实现方法,这取决于您实现当前服务器的方式.

html5 - 本质就是websocket的客户端,php Websocket 怎么接收数据

html5 - 本质就是websocket的客户端,php Websocket 怎么接收数据

class WebsocketClient
{

    private $_Socket = null;

    public function __construct($host, $port)
    {
        $this->_connect($host, $port);
    }

    public function __destruct()
    {
        $this->_disconnect();
    }

    public function sendData($data)
    {
        // send actual data:
        return fwrite($this->_Socket, $this->encode($data)) or die(''Error:'' . $errno . '':'' . $errstr);

        $wsData = fread($this->_Socket, 2000);
        $retData = trim($wsData, chr(0) . chr(255));

        return $retData;
    }

    private function encode($data)
    {
        $data = is_array($data) || is_object($data) ? json_encode($data) : (string)$data;
        $len = strlen($data);
        $mask = array();
        for ($j = 0; $j  127)
            {
                return false;
            }
        }
        $head[1] += 128;
        $head = array_merge($head, $mask);
        foreach ($head as $k => $v)
        {
            $head[$k] = chr($v);
        }
        $mask_data = '''';
        for ($j = 0; $j _generateRandomString(32);
        $key2 = $this->_generateRandomString(32);
        $key3 = $this->_generateRandomString(8, false, true);
        $header = "GET ws://" . $host . ":" . $port . "/ HTTP/1.1\r\n";
        $header .= "Host: " . $host . ":" . $port . "\r\n";
        $header .= "Connection: Upgrade\r\n";
        $header .= "Pragma: no-cache\r\n";
        $header .= "Cache-Control: no-cache\r\n";
        $header .= "Upgrade: websocket\r\n";
        $header .= "Sec-WebSocket-Version: 13\r\n";
        $header .= "User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36\r\n";
        $header .= "Accept-Encoding: gzip, deflate, sdch\r\n";
        $header .= "Accept-Language: zh-CN,zh;q=0.8\r\n";
        $header .= "Sec-WebSocket-Key: " . $key1 . "\r\n";
        $header .= "Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits\r\n";
        $header .= "\r\n";
        $this->_Socket = fsockopen($host, $port, $errno, $errstr, 2);
        fwrite($this->_Socket, $header) or die(''Error: '' . $errno . '':'' . $errstr);
        $response = fread($this->_Socket, 2000);

        /**
         * @todo: check response here. Currently not implemented cause "2 key handshake" is already deprecated.
         * See: http://en.wikipedia.org/wiki/WebSocket#WebSocket_Protocol_Handshake
         */
        return true;
    }

    private function _disconnect()
    {
        fclose($this->_Socket);
    }

    private function _generateRandomString($length = 10, $addSpaces = true, $addNumbers = true)
    {
        $characters = ''abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"§$%&/()=[]{}'';
        $useChars = array();
        // select some random chars:
        for ($i = 0; $i 
<p>能向服务器发送数组,怎么接收数据?</p>

                            
                        


                                                                                                                        
                     <h2>回复内容:</h2>
                      
                                                            
<pre>class WebsocketClient
{

    private $_Socket = null;

    public function __construct($host, $port)
    {
        $this-&gt;_connect($host, $port);
    }

    public function __destruct()
    {
        $this-&gt;_disconnect();
    }

    public function sendData($data)
    {
        // send actual data:
        return fwrite($this-&gt;_Socket, $this-&gt;encode($data)) or die(''Error:'' . $errno . '':'' . $errstr);

        $wsData = fread($this-&gt;_Socket, 2000);
        $retData = trim($wsData, chr(0) . chr(255));

        return $retData;
    }

    private function encode($data)
    {
        $data = is_array($data) || is_object($data) ? json_encode($data) : (string)$data;
        $len = strlen($data);
        $mask = array();
        for ($j = 0; $j  127)
            {
                return false;
            }
        }
        $head[1] += 128;
        $head = array_merge($head, $mask);
        foreach ($head as $k =&gt; $v)
        {
            $head[$k] = chr($v);
        }
        $mask_data = '''';
        for ($j = 0; $j _generateRandomString(32);
        $key2 = $this-&gt;_generateRandomString(32);
        $key3 = $this-&gt;_generateRandomString(8, false, true);
        $header = "GET ws://" . $host . ":" . $port . "/ HTTP/1.1\r\n";
        $header .= "Host: " . $host . ":" . $port . "\r\n";
        $header .= "Connection: Upgrade\r\n";
        $header .= "Pragma: no-cache\r\n";
        $header .= "Cache-Control: no-cache\r\n";
        $header .= "Upgrade: websocket\r\n";
        $header .= "Sec-WebSocket-Version: 13\r\n";
        $header .= "User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36\r\n";
        $header .= "Accept-Encoding: gzip, deflate, sdch\r\n";
        $header .= "Accept-Language: zh-CN,zh;q=0.8\r\n";
        $header .= "Sec-WebSocket-Key: " . $key1 . "\r\n";
        $header .= "Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits\r\n";
        $header .= "\r\n";
        $this-&gt;_Socket = fsockopen($host, $port, $errno, $errstr, 2);
        fwrite($this-&gt;_Socket, $header) or die(''Error: '' . $errno . '':'' . $errstr);
        $response = fread($this-&gt;_Socket, 2000);

        /**
         * @todo: check response here. Currently not implemented cause "2 key handshake" is already deprecated.
         * See: http://en.wikipedia.org/wiki/WebSocket#WebSocket_Protocol_Handshake
         */
        return true;
    }

    private function _disconnect()
    {
        fclose($this-&gt;_Socket);
    }

    private function _generateRandomString($length = 10, $addSpaces = true, $addNumbers = true)
    {
        $characters = ''abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"§$%&amp;/()=[]{}'';
        $useChars = array();
        // select some random chars:
        for ($i = 0; $i 
<p>能向服务器发送数组,怎么接收数据?</p>

                            
                        
            <pdata-id="1020000005871060">
                                    </p><p>http://www.workerman.net/workerman-chat<br>可以看下这个,PHP写的websocket聊天室,客服功能其实可以用里面的单聊功能实现 .有人用它实现过客服,包括网页和客户端软件。<br>开发手册:http://workerman.net/gatewaydoc/<br>Demo:http://chat.workerman.net/</p>
                            
            <pdata-id="1020000005852869">
                                    </p><p>百度上关于php websocket的教程已经有足够多了,你可以去看下。</p>
                            
            <pdata-id="1020000005871112">
                                    </p><p>socket_read读取</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/7fc7563c4182"rel="nofollow" target="_blank">PHP免费学习笔记(深入)</a>”;</p>
                            
            <pdata-id="1020000005876854">
                                    </p><p>已解决非常感谢各位解答</p>
登录后复制

HTML5 websockets与PHP websockets vs node.js websockets?

HTML5 websockets与PHP websockets vs node.js websockets?

我决定使用WebSockets作为我的网站聊天应用程序,我刚开始学习websockets,但我有三个不同的选项,node.js,PHP或HTML5.

我想知道的是三者之间有什么区别,我的意思是我不想学习所有这三者,如果有的话比其他人好.

解决方法

Web套接字是一种定义双方如何通信的协议.这是语言不可知的;任何语言都可以提供适配器与另一个Web套接字通信.你提到的三件事是这个适配器的三种不同的实现.对于聊天应用程序,您可能至少需要其中两个:一个服务器,一个客户端.选择您要编写服务器的语言(PHP或Node.js),并使用浏览器中的HTML 5 Web套接字功能与服务器通信.

IE11 对 websocket 报 SecurityError 问题

IE11 对 websocket 报 SecurityError 问题

IE11 对 websocket 报 SecurityError 问题

最近发现某些 IE11 版本 new websocket () 时会报 SecurityError 错误,有以下测试: 1. 访问站点与 wss 站点均为本地站点:无问题 2. 访问站点为公司测试环境,wss 站点为本地站点:SecurityError 报错的 IE11 版本各不相同,操作系统为 win7 32 位及 windows 2012 server,win7 64 位系统下 IE 未测试出报错。 解决方案为 Internet 选项 -> 安全 -> 本地 Internet-> 站点,把所有勾选取消。 猜测为 IE11 某些版本不支持本地站点与外部站点相混合的 websocket,问题细节还在深究,在此记录。

javascript – WebSocket握手期间出错:PHP的’Sec-WebSocket-Accept’标头值不正确

javascript – WebSocket握手期间出错:PHP的’Sec-WebSocket-Accept’标头值不正确

我用PHP编写了websocket服务器/客户端,它在2年内为我工作.现在它不起作用,说:WebSocket握手期间出错:错误的’Sec-WebSocket-Accept’标头值

我的客户端代码基本上是这样的:

socket = new WebSocket("ws://<?= EVENT_SERVER_ADDR ?>:"+EVENT_SERVER_PORT+"<?= EVENT_SERVER_WWW_PATH ?>");

PHP服务器端代码是这样的:

list ($resource, $host, $connection, $version, $origin, $key, $protocol, $upgrade) = $this->getheaders ($buffer);

$this->log ("Handshaking...");
$reply  = 
    "HTTP/1.1 101 Switching Protocols\r\n" .
    "Upgrade: {$upgrade}\r\n" .
    "Connection: {$connection}\r\n" .
    "Sec-WebSocket-Version: {$version}\r\n" .
    "Sec-WebSocket-Origin: {$origin}\r\n" .
    "Sec-WebSocket-Location: ws://{$host}{$resource}\r\n" .
    "Sec-WebSocket-Accept: " . $this->calcKey ($key) . "\r\n";
if ($protocol)
    $reply .= "Sec-WebSocket-Protocol: $protocol\r\n";
$reply .=   "\r\n";

// Closes the handshake
socket_write ($user->socket, $reply, strlen ($reply));

function calcKey ($key) {
    // Constant string as specified in the ietf-hybi-17 draft
    $key .= "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
    $key = sha1 ($key, true);
    // $key = pack ('H*', $key); // should I uncomment this line?
    $key = base64_encode ($key);

    return $key;
}

function getheaders ($buffer) {
    $resource = $host = $connection = $version = $origin = $key = $protocol = $upgrade = null;

    preg_match ('#GET (.*?) HTTP#', $buffer, $match) && $resource = $match[1];
    preg_match ("#Host: (.*?)\r\n#", $buffer, $match) && $host = $match[1];
    preg_match ("#Connection: (.*?)\r\n#", $buffer, $match) && $connection = $match[1];
    preg_match ("#Sec-WebSocket-Version: (.*?)\r\n#", $buffer, $match) && $version = $match[1];
    preg_match ("#Origin: (.*?)\r\n#", $buffer, $match) && $origin = $match[1];
    preg_match ("#Sec-WebSocket-Key:\s*(.*?)\r\n#", $buffer, $match) && $key = $match[1];
    preg_match ("#Sec-WebSocket-Protocol:\s*(.*?)\r\n#", $buffer, $match) && $protocol = $match[1];
    preg_match ("#Upgrade: (.*?)\r\n#", $buffer, $match) && $upgrade = $match[1];

    return array ($resource, $host, $connection, $version, $origin, $key, $protocol, $upgrade);
}

有趣的是,那些家伙只是改变了标准而没有保持旧代码的功能,也没有在网上说任何话(我真的很努力地去谷歌).有谁知道我的问题是什么?

解决方法:

所以我想出了问题所在.那是缓冲限制.

显然,变量$buffer只包含大约4 KB的数据,而且由于来自dataTables的cookie,输入数据要多得多.并且Sec-WebSocket-Key标题是在所有cookie之后.所以$key每次都是空的,给出了错误的Sec-WebSocket-Accept.

建议:调试更深入.

关于使用Secure Websocket和PHP – 加密握手websocket数据加密的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于html5 - 本质就是websocket的客户端,php Websocket 怎么接收数据、HTML5 websockets与PHP websockets vs node.js websockets?、IE11 对 websocket 报 SecurityError 问题、javascript – WebSocket握手期间出错:PHP的’Sec-WebSocket-Accept’标头值不正确等相关知识的信息别忘了在本站进行查找喔。

本文标签: