PHP: как исправить ошибку curl_exec() 60: невозможно получить сертификат локального эмитента?

(Первоначально этот вопрос назывался «Почему curl_exec() не работает в этом скрипте?» Но, добавив вызовы curl_errno() и curl_error() в скрипт, я обнаружил, что проблема была в сертификате, и соответствующим образом отредактировал вопрос. )

Следующий скрипт:

<?php
$sDataFile = '<path>\journal-issue-ToC.htm';
$sURL = 'https://onlinelibrary.wiley.com/toc/14678624/2014/85/1';
$bHeader = false;

$cURLhandle = curl_init();
$FilePointer = fopen($sDataFile, 'wb');

curl_setopt($cURLhandle, CURLOPT_URL, $sURL);
curl_setopt($cURLhandle, CURLOPT_FILE, $FilePointer);
curl_setopt($cURLhandle, CURLOPT_HEADER, $bHeader);

$bResult = curl_exec($cURLhandle);
echo('<br>' . ($bResult === false ? 'Failed to execute' : 'Executed') . ' cURL.');
if (! $bResult) echo('<br>Error #' . curl_errno($cURLhandle) . ': ' . curl_error($cURLhandle));
curl_close($cURLhandle);

fclose($FilePointer);

сохраняет пустой файл «journal-issue-ToC.htm» и генерирует следующий вывод браузера:

Failed to execute cURL.
Error #60: SSL certificate problem: unable to get local issuer certificate

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

Я использую PHP 7.2.2 на IIS 7.5 под 64-разрядной версией Windows 7.

Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
224
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что мне нужно было знать о сертификатах, чтобы заставить cURL работать, находится в статья на гитхабе, который объясняет необходимость сертификатов в cURL и как их получить и применить:

  • Мы говорим о сертификатах SSL, необходимых для протокола https. «CA» означает «центры сертификации».
  • Загрузите сертификаты из https://curl.haxx.se/ca/cacert.pem (документация).
  • В файле «php.ini», в разделе cURL, раскомментируйте команду для параметра CURLOPT_CAINFO и укажите расположение загруженного файла «cacert.pem». После сохранения файла ini перезапустите веб-сервер, чтобы изменения вступили в силу.

Я сделал это с несколькими вариантами:

  • Я решил установить значение CURLOPT_CAINFO в функции curl_setopt(), а не в файле «php.ini».
  • Сначала я получил ошибку 77, «Ошибка установки сертификата для проверки местоположения». Это было исправлено путем перемещения файла «cacert.pem» в папку в папке «Program Files\PHP».

После этого скрипт запустился без ошибок, и выходной файл не был пустым. Но то, что в нем было, все же не то, что мне нужно, что является предметом новый вопрос.

Другие вопросы по теме