WSS握手问题(PHP WebSocket服务器)

时间:2019-08-23 19:49:16

标签: php https websocket wss handshake

我使用PHP开发了WebSocket服务器,并且可以与ws://一起正常工作,但是在生产环境中,它使用https://,那么我必须使用wss://。

我应该使用证书启动套接字还是类似的东西?我无法解析标题以完成握手。

如何在https服务器后面执行握手?

这是具有Amazon证书的AWS EC2计算机。

我尝试将.pem文件导入套接字初始化,在我的https://环境后面运行ws://,但没有任何效果:(

套接字初始化:

$socket = stream_socket_server(
    "tcp://0.0.0.0:" . env("APP_WSS_PORTA"),
    $errno,
    $errstr
);

我也尝试过:

use Aws\Acm\AcmClient;

$cert = (new AcmClient(include config_path('aws.php')))->GetCertificate([
    "CertificateArn" => "arn:aws:acm:sa-east-1:EDITED_TO_STACKOVERFLOW"
])["CertificateChain"];

$cert_path = "cert.pem";

file_put_contents(base_path($cert_path), $cert);

$context = stream_context_create(
    ["ssl" => ["local_cert"=> $cert_path]]
);

$socket = stream_socket_server(
    "tcp://0.0.0.0:" . env("APP_WSS_PORTA"),
    $errno,
    $errstr,
    STREAM_SERVER_BIND|STREAM_SERVER_LISTEN,
    $context
);

我的握手功能:

function wsHandshake($data)
{
    echo "> Handshake " . remoteIp() . PHP_EOL;
    $lines = preg_split("/\r\n/", $data);

    $headers = array();
    foreach ($lines as $line) {
        $line = chop($line);
        if (preg_match('/\A(\S+): (.*)\z/', $line, $matches)) {
            $headers[$matches[1]] = $matches[2];
        }
    }

    var_dump($data); // to debug it :)
    if (!isset($headers['Sec-WebSocket-Version']) || $headers['Sec-WebSocket-Version'] < 6) {
        echo '> Versao do WebSocket nao suportada' . PHP_EOL;
        return false;
    }

    $sec_accept = base64_encode(pack('H*', sha1($headers['Sec-WebSocket-Key'] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
    $response   = "HTTP/1.1 101 Switching Protocols\r\n";
    $response  .= "Upgrade: websocket\r\n";
    $response  .= "Connection: Upgrade\r\n";
    $response  .= "Sec-WebSocket-Accept: " . $sec_accept . "\r\n";
    $response  .= "\r\n";
    return $response;
}

带有ws://

的var_dump
string(448) "GET / HTTP/1.1
Host: 127.0.0.1:3131
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Sec-WebSocket-Version: 13
Origin: http://localhost
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Key: PuIYHJZ4x8IyXajFf4WAsw==
Connection: keep-alive, Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
"

使用wss://

的var_dump
string(517) "\000\000��}hh�հ�h����`�ݘ����O��GQ�E� S�8�@��,��=��c���C8�ǯ�G!6{<\000$�+�/̨̩�,�0�
�       ��\0003\0009\000/\0005\000
\000�\000\000\000�\000\000\000
\000\000
        \000\000\000\000\000\000
                                \000\000\000#\000\000\000\000\000
                                                                 hhttp/1.1\000\000\000\000\000\000\0003\000k\000i\000\000 ��"�c��GLGX�Ƶ��:�"ŵ�)բ
                                                                                                                                                E��)\000\000Al�d��#Q{��t��q>��eb���u�+�d��M�!2�-��tI����z�y�\ĉ�\000\\000-\000\000\000@\000\0"...

0 个答案:

没有答案
相关问题