【问题标题】:How to setup WebSocket Secure connection with PHP?如何使用 PHP 设置 WebSocket 安全连接?
【发布时间】: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();
}

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

【问题讨论】:

    标签: php html websocket


    【解决方案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 化的简单方法。
      猜你喜欢
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 2015-05-25
      • 2012-07-30
      相关资源
      最近更新 更多