“SSL operation failed with code 1”

А так же “Failed to enable crypto in” и разные другие предупреждения во время выполнения стандартных файловых PHP функций, вроде get_headers(), file_get_contents(), fopen() и т.д., без указания параметра контекста (ну, то, что мы обычно и привыкли делать).

Да ладно там с предупреждениями, так ведь и результат выполнения функции будет неправильным. Тот же get_headers() выдаст false, вместо хэйдеров вполне себе реально существующего в интернетах URI.

Все это безобразие случается по причине того, что SSL сертификат запрашиваемого ресурса неверен, т.е. никем кроме вас самого не подписан. Таким образом, ресурс есть, но подключаться к нему по шифрованному протоколу (HTTPS, FTPS) ваш PHP не захочет.

Радикальное решение вышеозначенной проблемы на редкость просто. Нужно просто отключить проверку SSL сертификата для дефолтного контекста потока. Делается это при помощи следующего кода, который должен быть выполнен до того, как вы соберетесь обращаться к несертифицированным онлайн ресурсам.

$context = stream_context_set_default(array(
    'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
    ),
));
$content = file_get_contents($url, false, $context);

Ну если клиент капризничает и не хочет выдавать свой контент какому-то босоногому PHP скрипту, но готов обслуживать браузеры, то до кучи рекомендую скармливать ему еще и фэйковый user agent. Ну, например, так:

$context = stream_context_set_default(array(
    'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
    ),
    'http' => array(
        'user_agent' => 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:97.0) Gecko/20100101 Firefox/97.0/3871',
    ),
));
$content = file_get_contents($url, false, $context);
Liked Liked
No Comments