PHP - 将SSL添加到TCP套接字时出现意外行为

时间:2014-07-03 09:53:49

标签: php sockets ssl tcp websocket

我开发了PHP WebSocket服务器,它使用HTTP协议进行握手。一切都很好。
当我想添加SSL层时问题就出现了。当我启用它时,HTTP帧分为两部分 - 我需要两次调用read函数来读取第二部分:

  1. HTTP标头的第一个字母(G)
  2. 标题的其余部分
  3. 没有SSL一切正常。我尝试了很多修改,但没有结果。 有什么想法吗?

    读取函数列表:

    protected function read($toRead = 1400) {
      $return = "";
      for (;;) {
          if ($toRead < Config::$socket['chunk_size']) {
              $length = $toRead;
          } else {
              $length = Config::$socket['chunk_size'];
          }
          $sData = fread($this->socket, $length);
          if ($sData == false) return false;
          $toRead = $toRead - $length;
          $return .= $sData;
          if ($toRead == 0) break;
      }
      var_dump($return);
        return $return;
    }
    

    的SSLContext:

    protected function createSSLContext() {
        $context = stream_context_create();
        if (Config::$ssl['switch']) {
            stream_context_set_option($context, 'ssl', 'local_cert', Config::$ssl['filename']);     
            stream_context_set_option($context, 'ssl', 'allow_self_signed', true);
            stream_context_set_option($context, 'ssl', 'verify_peer', false);
            if (isset(Config::$ssl['passphrase'])) { 
                stream_context_set_option($context, 'ssl', 'passphrase', Config::$ssl['passphrase']);
            }
        }
        $this->context = $context;
    }
    

1 个答案:

答案 0 :(得分:0)

我一直在使用stunnel,但仍无法找到问题的解决方案。