How to make an HTTPS request using cURL?

35,547

Solution 1

The cacert.pem that you're passing to cURL via the CURLOPT_CAINFO is used to verify certificate authorities, but development servers typically have self signed certificates which are not included in that bundle.

The first step is to generate your own self signed certificate. This article describes the process step-by-step. Make sure that during the CSR generation you're using the intended server name under the Common Name (CN), e.g. ipv4.fiddler.

Once you have configured your web server using the self signed certificate (e.g. server.crt) and key (e.g. server.key), you need to copy the former to a location that your script can access it.

The following bare essentials can be used to verify the whole thing:

$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";
}

Solution 2

If I you want to send a ssl post request using Curl, without verify the certificate, you can use the following code:

$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);
Share:
35,547
donparalias
Author by

donparalias

(your about me is currently blank)

Updated on July 09, 2022

Comments

  • donparalias
    donparalias almost 2 years

    I have 2 php scripts , to send an xml file and catch it. I am using cURL and everything was ok. Now i am trying to do the same but using HTTP over SSL (HTTPS). I have installed a local server with XAMPP and i have set up SSL by following this post : Setting up SSL on a local xampp/apache server .

    I am trying to send the xml file like this :

    <?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.
    ?>
    

    I downloaded the new certificate for cURL from here :

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

    I am not sure where i should put the certificate but i put it in my workspace directory of this project.

    The problem now is that the XML file is never sent to the receiver. Any ideas?