Php curl ssl false

PHP’s cURL: How to connect over HTTPS?

I need to do a simple GET request to EC2 Query API with regular URL encoded query string. The protocol is HTTPS. How would I send the request with the help of PHP’s cURL.

5 Answers 5

$url = "https://example.com"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); $result = curl_exec($ch); curl_close($ch); print_r($result); 

CURLOPT_SSL_VERIFYPEER

Check if peer certificate is valid or invalid/expired.

CURLOPT_SSL_VERIFYHOST quoting from php manual:

1 to check the existence of a common name in the SSL peer certificate. 2 to check the existence of a common name and also verify that it matches the hostname provided.

Sending a request via curl, to an HTTPS URL, is not that hard by itself, in terms of PHP code.

Something like this should do perfectly fine (I just tried this portion of code on my machine, Windows, PHP 5.3) :

$url = 'https://. /. '; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($ch); curl_close($ch); echo $data; 

And it outputs the result fine : the same thing I get in my browser when trying to access the https:// URL ; except for the CSS, of course.

You might want to take a look at the manual page of the curl_setopt function : there are a lot of options, and some of those might be useful, in your specific case 🙂

Here, I used CURLOPT_SSL_VERIFYPEER and CURLOPT_SSL_VERIFYHOST ; not sure you’ll need those with Amazon, but I had to use them, else this portion of code didn’t work — but that might be related to the fact that the certificate I’m using is self-signed. Try with and without those, and you’ll quickly find out if you need them.

Читайте также:  Номер белого цвета html

Источник

Использование curl в PHP для доступа к сайтам по Https(ssl/tls)

В Php для доступа к сайтам по http, https, FTP часто используется библиотека curl.

На практике, однако, наиболее часто используется протокол, HTTP особенно при соединении server-to-server . Curl же используется при таких методах доступа как

XML-RPC или REST для запроса ресурса. Либо же если производится соединение с сервером посредством какого-либо API. Ну и последним использованием curl в php можно назвать парсинг ресурсов.

Тем не менее, при попытке получить доступ к ресурсу по HTTPS, например, через API, могут возникнуть определенные проблемы в подключении, о которых и пойдет речь.

Основной проблемой при данном соединении с использованием Curl можно назвать невозможность библиотекой проверить недоверенный сертификат сайта. Смоделируем ситуацию.

Предположим мы используем следующий код

// Initialize session and set URL. $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); // Set so curl_exec returns the result instead of outputting it. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Get the response and close the channel. $response = curl_exec($ch); curl_close($ch);

Если $url указывает на https ресурс как результат выполнения данного кода мы получим

Failed: Error Number: 60. Reason: SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Это происходит потому, что Curl не был настроен доверять HTTPS сертификату сервера.

Понятия сертификаты и PKI вращается вокруг доверия сертификатов (CA), и по умолчанию, Curl настроен не доверять CA, таким образом, он не будет доверять сертификату любого веб-сервера. Так почему же не у нас не возникли проблемы посещения HTTPs сайтов через веб-браузер? Разработчики браузера включают в себя список корневых доверенных центров сертификации, у которых может быть приобретен сертификат сайта.

Таким образом необходимо либо разрешить Curl доверять нашему сертификату, либо запретить проверку доверия к сертификату при использовании библиотеки.

Обратимся к более простому решению – запретим Curl проверять сертификат, фактически настроив на доверие к любому полученному сертификату.

Читайте также:  Javascript static variable in function

Это не очень верное решение с точки зрения безопасности, но действенно. Для выполнения данной настройки перед вызовом curl curl_exec() достаточно вставить следующую строку

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Это заставляет библиотеку Curl принимать любые сертификаты, но если Вы обеспокоены, что у Вас принимаются все сертификаты без разбора необходимо сделать немного больше действий.

Оговоримся, что будем использовать такой параметр Curl CURLOPT_CAINFO и сертификат, полученный с сайта.

Давайте извлечем сертификат, используя наш броузер.

Откроем сайт и увидим следующую картинку в нижней части броузера.

1-2016

Нажмем «просмотреть сертификат»

2-2016

И далее в пункте «Детали» на странице сертификатов выберем наш сертификат. Это доверенный корневой сертификат.

3

Нам необходимо его экспортировать для дальнейшего использования Curl

4

Нажмем “Экспорт”, и сохраним наш корневой сертификат как X.509 Certificate (PEM).

Далее нам необходимо модифицировать настройки cURL для использования CA сертификата с параметром CURLOPT_CAINFO, где мы укажем место сохранения сертификата .

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "/CAcerts/BuiltinObjectToken-EquifaxSecureCA.crt");

Failed: Error Number: 60. Reason: SSL certificate problem, verify that the CA cert is OK. Details:

error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Источник

PHP CURL & HTTPS

The only problem I have is that it doesn’t work for https://. Anny ideas what I need to do to make this work for https? Thanks!

curl by default check if the SSL certificate is valid . you might want to disable that behaviour if you self signed the certificate in question

4 Answers 4

Quick fix, add this in your options:

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false) 

Now you have no idea what host you’re actually connecting to, because cURL will not verify the certificate in any way. Hope you enjoy man-in-the-middle attacks!

Читайте также:  Java api all classes

Or just add it to your current function:

/** * 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; > 

Источник

Оцените статью