PHP: Как исправить ошибку 60 curl_exec (): невозможно получить сертификат локального эмитента? - PullRequest
0 голосов
/ 08 апреля 2019

(Этот вопрос изначально назывался «Почему в этом сценарии происходит сбой 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.

1 Ответ

0 голосов
/ 09 апреля 2019

Что мне нужно было знать о сертификатах, чтобы заставить cURL работать, в статье на GitHub , в которой объясняется необходимость сертификатов в 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».

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

...