如何使用 PHP 设置 WebSocket 安全连接?

Posted

技术标签:

【中文标题】如何使用 PHP 设置 WebSocket 安全连接?【英文标题】:How to setup WebSocket Secure connection with PHP? 【发布时间】:2012-05-16 00:42:17 【问题描述】:

我找不到任何关于在 php 中设置 wss 连接的信息。 我连接throw ws没问题。顺便说一句,我正在使用这个非常棒的库来做到这一点:https://github.com/albeva/php-websocket

但是我的网站使用 https 并且我需要一个 WebSocket 安全连接以避免 Firefox 抱怨连接不安全的事实。

提前感谢您的帮助。


编辑

这里是库用来启动套接字连接的代码:

$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();

我认为我需要更改此代码,但我找不到方法。

【问题讨论】:

【参考方案1】:

你试过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);

?>

【讨论】:

【参考方案2】:

这是一个示例(和链接),稍作修改,并从另一个 SO 帖子中找到。 Link to other post

这里是 stream_context_create php 函数定义的链接。 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); 
 

然而,在链接的 SO 帖子的最底部,您会找到来自“Sam”的答案。我需要在接下来的几周内做同样的事情,所以我计划使用 Sams 方法......因为我更喜欢 PHP 中的 CURL。

【讨论】:

我更新了我的帖子以显示我正在使用的库的启动函数(使用 php 套接字扩展)。我已经阅读了您指出的帖子,但无法使用此代码。【参考方案3】:

您目前最好的 PHP 方法是使用 Ratchet。设置 wss 连接的最佳方法是将您的 websocket 服务器放在 nginx 或 HAProxy 后面,它们将为您处理所有 SSL 内容。这是用 HAProxy 解释的here。请注意,您可以对 Nginx 执行相同操作,因为它现在也支持 WebSocket。

【讨论】:

我发现 stunnel 是一种对不安全服务进行 SSL 化的简单方法。

以上是关于如何使用 PHP 设置 WebSocket 安全连接?的主要内容,如果未能解决你的问题,请参考以下文章

如何调试 websocket 应用程序

如何使用 WebSocket 从 PHP 发送数据/文本进行处理?

在不运行守护进程的情况下设置 Websocket 服务器

使用 Ratchet for PHP 通过 WebSocket 流式传输二进制数据

Swoole—WebSocket—Task任务使用

Swoole—WebSocket—Task任务使用