PHP CURL & HTTPS
Я нашел эту функцию, которая выполняет AWESOME работу (IMHO): http://nadeausoftware.com/articles/2007/06/php_tip_how_get_web_page_using_curl
/**
* Get a web file (HTML, XHTML, XML, image, etc.) from a URL. Return an
* array containing the HTTP server response header fields and content.
*/
function get_web_page( $url )
{
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => "spider", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
);
$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );
$header['errno'] = $err;
$header['errmsg'] = $errmsg;
$header['content'] = $content;
return $header;
}
Единственная проблема, с которой я сталкиваюсь, заключается в том, что она не работает для https://. Anny идеи, что мне нужно сделать, чтобы сделать эту работу для https? Спасибо!
Ответы
Ответ 1
Быстрое исправление, добавьте это в свои настройки:
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false)
Теперь вы не знаете, к какому хосту вы на самом деле подключаетесь, потому что cURL не будет проверять сертификат в любом случае. Надеюсь, вам понравятся атаки "человек посередине"!
Или просто добавьте его в текущую функцию:
/**
* Get a web file (HTML, XHTML, XML, image, etc.) from a URL. Return an
* array containing the HTTP server response header fields and content.
*/
function get_web_page( $url )
{
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => "spider", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
CURLOPT_SSL_VERIFYPEER => false // Disabled SSL Cert checks
);
$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );
$header['errno'] = $err;
$header['errmsg'] = $errmsg;
$header['content'] = $content;
return $header;
}
Ответ 2
Я пытался использовать CURL для выполнения некоторых вызовов API https с помощью php и столкнулся с этой проблемой. Я заметил рекомендацию на php-сайте, который запустил меня: http://php.net/manual/en/function.curl-setopt.php#110457
Пожалуйста, всем, остановите настройку CURLOPT_SSL_VERIFYPEER на false или 0. Если ваша установка PHP не имеет обновленного корневого сертификата CA пакет, загрузите его на сайт curl и сохраните его на своем Сервер:
http://curl.haxx.se/docs/caextract.html
Затем установите путь к нему в файле php.ini, например. в Windows:
curl.cainfo = C:\PHP\cacert.pem
Отключение CURLOPT_SSL_VERIFYPEER позволяет человеку посередине (MITM) атаки, которые вам не нужны!
Ответ 3
Другой вариант, например, ответ гэвина Палмера, - использовать файл .pem
, но с параметром скручивания
загрузите последний обновленный файл .pem
из https://curl.haxx.se/docs/caextract.html и сохраните его где-нибудь на своем сервере (вне общедоступной папки)
установите опцию в своем коде вместо файла php.ini
.
В вашем коде
curl_setopt($ch, CURLOPT_CAINFO, $_SERVER['DOCUMENT_ROOT'] . "/../cacert-2017-09-20.pem");
ПРИМЕЧАНИЕ: установка cainfo в php.ini
, как это сделал @Gavin Palmer, лучше, чем установка его в вашем коде, как я, потому что он будет сохранять дисковый ввод-вывод при каждом вызове функции, я просто делаю это так в случае, если вы хотите протестировать файл cainfo на лету вместо изменения php.ini
во время тестирования вашей функции.
Ответ 4
Одно важное замечание, упомянутое выше решение не будет работать на локальном хосте, вы должны загрузить свой код на сервер, и тогда оно будет работать. Я не получал никакой ошибки, чем плохой запрос, проблема была в том, что я использовал localhost (test.dev, myproject.git). Оба вышеупомянутых решения работают, рекомендуется использовать решение, использующее SSL-сертификат.
Перейдите на https://curl.haxx.se/docs/caextract.html и загрузите последнюю версию cacert.pem. Магазин где-то (не в общей папке - но будет работать независимо)
Используйте этот код
."$ Результат; //echo "
Путь:". $ _ SERVER ['DOCUMENT_ROOT']. "/Ssl/cacert.pem"; // это только для устранения неполадок?>
- Загрузите код на живой сервер и протестируйте.