PHP — Неожиданное поведение при добавлении SSL в сокет TCP

#php #sockets #ssl #tcp #websocket

#php #сокеты #ssl #tcp #websocket

Вопрос:

Я разработал PHP WebSocket server, который использует протокол HTTP для подтверждения связи. Все работало нормально.
Проблема началась, когда я захотел добавить слой SSL. Когда я включаю его, HTTP-фреймы разделяются на 2 части — мне нужно дважды вызвать функцию чтения, чтобы прочитать 2-ю часть:

  1. Первая буква заголовка HTTP (G)
  2. Остальная часть заголовка

Без 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. ошибки вообще не отображаются?

2. вы включили «Отображать ошибки»?

3. да, ini_set(‘display_errors’, ‘On’);

Ответ №1:

Я использовал stunnel вместо этого, но все еще не могу найти решение проблемы.