Partiz
@Partiz

Как поймать SSL ошибку при не удачной попытке соединения/хнедшейка stream_socket_client?

Возникла задача отлавливать (не просто заглушать) ошибки которые могут происходить при вызове stream_socket_client. Проблемы с ДНС/непосредственным соединением сокета/т.п. отлавливаются через $errno и $errstr а вот если происходит ошибка внутри SSL-ля то в $errno и $errstr пусто. Пробовал смотреть в openssl_error_string() - там тоже по нулям. Собственно тестовый код:
$context = stream_context_create([
    'ssl' => [
        'capture_peer_cert'     => true,
        'verify_peer'           => false,
        'allow_self_signed'     => true,
        'SNI_enabled'           => true,
    ]
]);


$stream = stream_socket_client('ssl://localhost:80', $errno, $errstr, 30,
    STREAM_CLIENT_CONNECT, $context);

if ($stream === FALSE) {
    print "Connection error: errno:$errno errstr:$errstr\n";
    while($err = openssl_error_string()) {
        print "SSL Error: $err\n";
    }
    exit;
}



PHP Warning: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:
error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol in /tmp/ssl_t.php on line 15
PHP Warning: stream_socket_client(): Failed to enable crypto in /tmp/ssl_t.php on line 15
PHP Warning: stream_socket_client(): unable to connect to ssl://localhost:80 (Unknown error) in /tmp/ssl_t.php on line 15
Connection error: errno:0 errstr:


Собственно задача: погасить варнинг через @ а ошибку(а желательно все 3 варнинга) "error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol" каким то образом отловить в коде
  • Вопрос задан
  • 696 просмотров
Решения вопроса 1
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Можно использовать свой error_handler чтобы перехватывать warning'и в том месте где может возникнуть ошибка
https://www.php.net/manual/ru/function.set-error-h...
А потом восстанавливать стандартный error_handler если нужно
https://www.php.net/manual/ru/function.restore-err...

set_error_handler(function($errno, $errstr, $errfile, $errline){
    //своя логика обработки $errno, $errstr 
});

//$stream = stream_socket_client( ...

restore_error_handler();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы