Как сделать запрос HTTPS с помощью cURL?

У меня есть 2 скрипта php, чтобы отправить XML-файл и поймать его. Я использую cURL, и все было в порядке. Теперь я пытаюсь сделать то же самое, но используя HTTP over SSL (HTTPS). Я установил локальный сервер с XAMPP, и я установил SSL, следуя этому сообщению: Настройка SSL на локальном сервере xampp / apache .

Я пытаюсь отправить XML-файл следующим образом:

<?php /* * XML Sender/Client. */ // Get our XML. You can declare it here or even load a file. $xml = file_get_contents("data.xml"); // We send XML via CURL using POST with a http header of text/xml. $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt ($ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem"); //i use this line only for debugging through fiddler. Must delete after done with debugging. curl_setopt($ch, CURLOPT_PROXY, '127.0.0.1:8888'); // set URL and other appropriate options curl_setopt($ch, CURLOPT_URL, "https://ipv4.fiddler/iPM/receiver.php"); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml')); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); curl_setopt($ch, CURLOPT_REFERER, 'https://ipv4.fiddler/iPM/receiver.php'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $ch_result = curl_exec($ch); echo "Result = ".$ch_result; curl_close($ch); // Print CURL result. ?> 

Я загрузил новый сертификат для cURL:

http://curl.haxx.se/ca/cacert.pem

Я не уверен, куда я должен поместить сертификат, но я поместил его в каталог рабочей области этого проекта.

Проблема в том, что XML-файл никогда не отправляется получателю. Есть идеи?

cacert.pem который вы передаете cURL через CURLOPT_CAINFO , используется для проверки полномочий сертификатов, но серверы разработки обычно имеют самоподписанные сертификаты, которые не включены в этот пакет.

Первый шаг – создать свой собственный сертификат. В этой статье описывается процесс шаг за шагом. Убедитесь, что во время генерации CSR вы используете имя предполагаемого сервера под Common Name (CN) , например ipv4.fiddler .

После того, как вы настроили свой веб-сервер с помощью самоподписанного сертификата (например, server.crt ) и ключа (например, server.key ), вам нужно скопировать его в место, к которому ваш скрипт может получить к нему доступ.

Для проверки всего этого можно использовать следующие основные вещи:

 $ch = curl_init('https://ipv4.fidler'); curl_setopt_array($ch, array( CURLOPT_SSL_VERIFYPEER => true, CURLOPT_SSL_VERIFYHOST => 2, CURLOPT_VERBOSE => true, CURLOPT_CAINFO => '/path/to/server.crt', )); if (false === curl_exec($ch)) { echo "Error while loading page: ", curl_error($ch), "\n"; } 

Если я хочу отправить запрос ssl post с помощью Curl , не проверяя сертификат, вы можете использовать следующий код:

 $data = array( 'name' => $name, 'ip' => $ip, 'text'=> "text" ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,'https://myserver.com/index.php/'); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); // receive server response ... curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $server_output = curl_exec ($ch); curl_close ($ch);