LINUX.ORG.RU

PHP: stream_socket_enable_crypto не хочет переключать поток в режим шифрования

 , , ,


0

1

Пробую уже существующий сокет экспортировать в поток и перевести этот поток в режим TLS. В php.ini прописал:

openssl.cafile=/etc/ssl/certs/ca-certificates.crt
openssl.capath=/etc/ssl/certs

Пробую код:

<?php

    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

    $result = socket_connect($socket, 'google.com', 443);
    if ($result === false) {

            $str_err = "socket_connect() failed. Reason: ($result) ".socket_strerror(socket_last_error($socket));
            exit;
    }

    $opts = array(
    'ssl' => array(

        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true,
    )
    );

    stream_context_set_default($opts);
    $fd = socket_export_stream($socket); //делаем из сокета поток

    if(stream_socket_enable_crypto($fd, true, STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT) === false) {

    die("Can't switch protocol");
    exit;
    }

echo "Success";
?>

Поток созданный из сокета в режим не переводится, гугл не помогает.

PHP 7.0.33-0+deb9u6 (cli) (built: Oct 24 2019 18:50:20) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.33-0+deb9u6, Copyright (c) 1999-2017, by Zend Technologies

много лет назад я писал как-то так

  stream_set_blocking ($fd, true);
  stream_socket_enable_crypto ($fd, true, чего-то тут);
  stream_set_blocking ($fd, false);
сейчас даже не вспомню почему. попробуй могёт поможет.

vtVitus ★★★★★
()

Я слышал, что в PHP любят пихать всё подряд в глобальный scope, но чтобы настолько?

anonymous
()
Ответ на: комментарий от vtVitus

я так же не понимаю почему это должно работать. После такой конструкции когда делаю fgets($fd…), в буфер приходят бинарные данные похожие на хэндшейк. Видел где-то на форумах подобные вопросы, но не видел корректных ответов.

ocr
() автор топика
Последнее исправление: ocr (всего исправлений: 1)

опытным путем выяснил что сокет преобразованный в поток с помощью socket_export_stream(...) не переводится в режим работы с tls/ssl, а поток созданный обычным путем переводится. Глянул снифером, вызов stream_socket_enable_crypto инициирует создание сессии ssl/tls кторая обрывается в случае с экспортированным потоком из сокета.

Это вопрсы к внутренним структурам в которых ковыряться лень.

На пхп-шном офсайте для socket_export_stream(...) есть только краткое описание и «This function is currently not documented; only its argument list is available.»

ocr
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.