使用PHP建立WebSocket安全(wss)连接

3

我正在学习WebSocket,已经了解了如何进行握手。这段代码是没有SSL的握手,我在服务器上添加了SSL证书,但现在它不起作用:

$host = '176.xxx.xx.xx';
$port = 44444;

//Create TCP/IP sream socket and return the socket resource
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// Bind the source address
socket_bind($socket, $host, $port);

// Listen to incoming connection
echo "listening\r\n";
socket_listen($socket);

// Accept new connections
$resource = socket_accept($socket);

echo $headers = socket_read($resource, 1024);

preg_match('/Sec-WebSocket-Key\: (.+?)\r\n/', $headers, $key);

$acceptKey = $key[1].'258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
$acceptKey = base64_encode(sha1($acceptKey, true));

$upgrade = "HTTP/1.1 101 Switching Protocols\r\n".
           "Upgrade: websocket\r\n".
           "Connection: Upgrade\r\n".
           "Sec-WebSocket-Accept: $acceptKey".
           "\r\n\r\n";
$r1 = socket_write($resource,$upgrade,strlen($upgrade));

socket_close($resource);

我知道这不是完美的代码 - 我可以自己改进它,但我不能自己解决SSL问题。所以请专注于解决这个问题。

我查找了很多内容,但只找到非常复杂的解决方案,而且我根本无法使用它们。我必须使用我的证书和私钥的.pem文件,但该如何将其添加到该套接字中呢?请不要给我使用node.js或socket.io的解决方案,它必须由PHP制作。此外,我更喜欢不使用任何复杂的类,因为我想了解基础知识并创建自己的类 - 这是因为我想为非常特定的问题使用WebSockets。

非常感谢!


可能相关:https://dev59.com/MWkv5IYBdhLWcg3waANT - user1531971
1个回答

1
如果你正在使用自签名证书,请确保你也使用HTTPS提供页面,这样你就可以接受浏览器将显示的警告,因为证书中缺少有效的CA。否则,如果您在HTTP下提供页面,并使用带有自签名证书的WSS websocket,则连接将失败。

使用“有效”的证书(而非自签名)或者一开始就使用它。除此之外,也许这里提供了一些提示:https://dev59.com/L2Qn5IYBdhLWcg3wP1NU(如果你不想重复造轮子..那就是在PHP中使用WebSocket)。 - oberstet
我的证书是自签名的,但我在浏览器中接受了“风险”,网站在HTTPS下正常工作。我的Websocket客户端(在浏览器中)在HTTPS下启动。 - MateuszBlaszczyk
你用于连接的URL是什么?它必须以WSS://开头,而不是HTTPS://。 - vtortola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接