Бортовой журнал Ктулху
Оказывается, футбол придумал дедушка, который все-таки догнал убежавшего колобка...

Ошибка file_get_contents при использовании самоподписанных сертификатов

В связи с переходом на https возникла проблема при получении файлов при помощи функции file_get_contents, а именно,file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:↵error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed.

Если бы сертификат не был самоподписанным, можно было бы обойтись такой конструкцией:

$arrContextOptions=array(
"ssl"=>array(
"verify_peer"=>false,
"verify_peer_name"=>false,
),
);
$resource = file_get_contents($link, false, stream_context_create($arrContextOptions));

Но в случае с самоподписанным сертификатом нужно его добавить в хранилище что не всегда возможно.

Пример как это сделать:

~$ cd /usr/local/share/ca-certificates/

~$ sudo mkdir my_cert

Скопировать .crt в my_cert

Убедиться в разрешениях (755 для директории, 644 для файла)

~$ sudo update-ca-certificates

Выходом из этой ситуации может служить замена на Curl(), который умеет игнорировать подобные ошибки.

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $link);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$res = curl_exec($ch);
if (curl_errno($ch)) {
echo curl_error($ch);
}
curl_close($ch);

Второй код выполняет идентичное первому действие.