Сильно удивляющие случайные, прерывистые проблемы с проверкой SSL в PHP file_get_contents для HTTPS URL-адресов

Вопрос или проблема

Я сталкиваюсь с периодическими проблемами верификации SSL при использовании file_get_contents в PHP для доступа к нескольким HTTPS URL.

Когда я пытаюсь индивидуально протестировать URL, которые не проходят проверку, такие как https://getcomposer.org/versions, с помощью:

<?php
$options = [
    "ssl" => [
        "cafile" => "C:\\xampp\\php\\cacert.pem",
        "verify_peer" => true,
        "verify_peer_name" => true,
    ]
];
$context = stream_context_create($options);
echo file_get_contents('https://getcomposer.org/versions', false, $context);
?>

Я получаю следующие ошибки:

// Ошибка: PHP Warning:  file_get_contents(): SSL операция не удалась с кодом 1. Сообщения об ошибках OpenSSL: error:0A000086:SSL routines::certificate verify failed в C:\Users\HP\test.php на строке 10

Warning: file_get_contents(): SSL операция не удалась с кодом 1. Сообщения об ошибках OpenSSL: error:0A000086:SSL routines::certificate verify failed в C:\Users\HP\test.php на строке 10 PHP Warning:  file_get_contents(): Не удалось включить криптографию в C:\Users\HP\test.php на строке 10

Warning: file_get_contents(): Не удалось включить криптографию в C:\Users\HP\test.php на строке 10 PHP Warning:  file_get_contents(https://getcomposer.org/versions): Не удалось открыть поток: операция не удалась в C:\Users\HP\test.php на строке 10

Warning: file_get_contents(https://getcomposer.org/versions): Не удалось открыть поток: операция не удалась в C:\Users\HP\test.php на строке 10

```

Поэтому, для целей отладки, я создал скрипт для проверки нескольких доменов:

<?php
$options = [
    "ssl" => [
        "cafile" => "C:\\xampp\\php\\cacert.pem",
        "verify_peer" => true,
        "verify_peer_name" => true,
    ]
];

$context = stream_context_create($options);

// Список доменов для проверки
$domains = [
    'https://google.com',
    'https://youtube.com',
    'https://example.com',
   // еще 27 доменов
];

$working_domains = [];
$non_working_domains = [];

foreach ($domains as $domain) {
    $response = @file_get_contents($domain, false, $context);

    if ($response !== false) {
        $working_domains[] = $domain;
    } else {
        $non_working_domains[] = $domain;
    }
}

// Результаты
echo "Работающие домены:\n";
foreach ($working_domains as $working) {
    echo $working . "\n";
}

echo "\nНе работающие домены:\n";
foreach ($non_working_domains as $non_working) {
    echo $non_working . "\n";
}
?>

Скрипт выводит список работающих и неработающих доменов. Вот результаты:

Работающие домены:
https://google.com
https://youtube.com
https://www.facebook.com
https://twitter.com
https://www.amazon.com
https://www.microsoft.com
https://www.mozilla.org
https://www.wikipedia.org
https://www.quora.com

Не работающие домены:
https://example.com
https://getcomposer.org
https://www.bbc.com
https://www.cnn.com
https://www.reuters.com
https://www.instagram.com
https://www.ebay.com
https://www.alibaba.com
https://www.harvard.edu
Stanford University
https://www.mit.edu https://www.apple.com https://www.github.com https://www.netflix.com https://www.spotify.com https://www.dropbox.com https://www.cloudflare.com https://www.w3.org https://www.random.org https://example.org https://www.linkedin.com

Я абсолютно теряю рассудок. Кажется, нет никакой логики в том, какие домены проходят проверку, а какие нет. Я подозреваю, что проблема может быть связана с верификацией SSL-сертификата, но не уверен, как это диагностировать дальше. Я уже убедился, что файл cacert.pem обновлен и правильно указан.

Что может вызывать проблемы с некоторыми HTTPS URL, в то время как другие работают, и как я могу решить эту проблему?

Я обнаружил, что мой антивирус AVG вызывал проблемы с соединениями curl SSL на моем локальном компьютере. Даже после отключения расширенной защиты фаервола, я продолжал испытывать проблемы до тех пор, пока полностью не удалил AVG. Это решило проблему.


Ответ или решение

Решение проблемы с интермиттирующими ошибками проверки SSL в PHP при использовании file_get_contents

Ваша ситуация с intermittent SSL verification issues при работе с HTTPS-URL в PHP действительно может вызывать замешательство. Давайте проанализируем возможные причины возникновения этих ошибок и способы их устранения.

1. Понимание ошибок SSL

Вы упомянули несколько ошибок, связанных с SSL:

  • certificate verify failed
  • Failed to enable crypto

Каждая из этих ошибок может возникать по различным причинам, включая проблемы с сертификатом, неправильную настройку файловых путей к cacert.pem, а также внешние факторы, такие как программное обеспечение для защиты.

2. Проверка конфигурации

a. Файл cacert.pem

Первое, что стоит сделать — убедиться, что файл cacert.pem актуален и доступен по указанному пути. Вы можете скачать последнюю версию здесь.

Убедитесь, что ваш путь к файлу прописан правильно:

"cafile" => "C:\\xampp\\php\\cacert.pem",

Проверьте наличие файла и его содержимое с помощью команды:

openssl x509 -in C:\xampp\php\cacert.pem -text -noout
b. Настройки PHP

Проверьте настройки PHP на наличие значений:

  • openssl.cafile
  • openssl.capath

Эти параметры могут быть настроены в файле php.ini. Убедитесь, что их значения совпадают с расположением вашего cacert.pem.

3. Влияние антивирусов и файрволов

Как вы уже сами заметили, программное обеспечение антивирусного типа, например, AVG, может существенно влиять на обработку запросов SSL. Эти программы могут блокировать или изменять SSL-соединения. Эти вмешательства могут проявляться как случайные ошибки в зависимости от состояния системы.

  • Решение: Если вы столкнулись с проблемами проверки SSL, попробуйте временно отключить антивирусные программное обеспечение или фаервол и протестировать скрипт еще раз. Если это решает проблему, вы можете рассмотреть возможность настройки исключений в вашем антивирусе для ваших PHP-скриптов.

4. Проблемы с сервером

Некоторые серверы могут иметь некорректно настроенные SSL-сертификаты:

  • Срок действия сертификата: Убедитесь, что сертификаты серверов не истекли.
  • Полнота цепочки сертификатов: Проверьте, что сервер предоставляет полный путь сертификации.

5. Дебаггинг и дополнительная диагностика

Вы можете использовать утилиты отладки для тестирования проблемы. Для этого подойдут инструменты командной строки, например curl, которые могут предоставить более детальную информацию об ошибках:

curl -vI https://getcomposer.org/versions

Это позволит вам получить понимание, что конкретно идет не так при установлении соединения.

Заключение

Интермиттирующие проблемы с SSL могут быть вызваны множеством факторов, от неверных настроек и устаревших файлов сертификатов до вмешательства стороннего программного обеспечения. Тщательным образом следуйте всем вышеуказанным шагам, чтобы проанализировать проблему и минимизировать возможность её повторения в будущем. Обязательно проверяйте каждую потенциальную причину, прежде чем двигаться дальше, и статистически фиксируйте любые изменения, чтобы удостовериться, что ошибка не появляется вновь.

Оцените материал
Добавить комментарий

Капча загружается...