Вопрос или проблема
Я сталкиваюсь с периодическими проблемами верификации 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 могут быть вызваны множеством факторов, от неверных настроек и устаревших файлов сертификатов до вмешательства стороннего программного обеспечения. Тщательным образом следуйте всем вышеуказанным шагам, чтобы проанализировать проблему и минимизировать возможность её повторения в будущем. Обязательно проверяйте каждую потенциальную причину, прежде чем двигаться дальше, и статистически фиксируйте любые изменения, чтобы удостовериться, что ошибка не появляется вновь.