PHP CURL & HTTPS PHP CURL & HTTPS curl curl

PHP CURL & HTTPS


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!

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


I was trying to use CURL to do some https API calls with php and ran into this problem. I noticed a recommendation on the php site which got me up and running: http://php.net/manual/en/function.curl-setopt.php#110457

Please everyone, stop setting CURLOPT_SSL_VERIFYPEER to false or 0. If your PHP installation doesn't have an up-to-date CA root certificate bundle, download the one at the curl website and save it on your server:

http://curl.haxx.se/docs/caextract.html

Then set a path to it in your php.ini file, e.g. on Windows:

curl.cainfo=c:\php\cacert.pem

Turning off CURLOPT_SSL_VERIFYPEER allows man in the middle (MITM) attacks, which you don't want!


Another option like Gavin Palmer answer is to use the .pem file but with a curl option

  1. download the last updated .pem file from https://curl.haxx.se/docs/caextract.html and save it somewhere on your server(outside the public folder)

  2. set the option in your code instead of the php.ini file.

In your code

curl_setopt($ch, CURLOPT_CAINFO, $_SERVER['DOCUMENT_ROOT'] .  "/../cacert-2017-09-20.pem");

NOTE: setting the cainfo in the php.ini like @Gavin Palmer did is better than setting it in your code like I did, because it will save a disk IO every time the function is called, I just make it like this in case you want to test the cainfo file on the fly instead of changing the php.ini while testing your function.