cacert php curl https

php - cacert curl



PHP CURL & HTTPS (3)

Encontré esta función que hace un trabajo IMPRESIONANTE (en mi humilde opinión): 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; }

El único problema que tengo es que no funciona para https: //. ¿Qué ideas tengo que hacer para que esto funcione para https? ¡Gracias!


Estaba intentando usar CURL para hacer algunas llamadas a la API https con php y encontré este problema. Observé una recomendación en el sitio php que me puso en funcionamiento: http://php.net/manual/en/function.curl-setopt.php#110457

Por favor, deje de configurar CURLOPT_SSL_VERIFYPEER en falso o 0. Si su instalación de PHP no tiene un paquete de certificados raíz de CA actualizado, descargue el que está en el sitio web curl y guárdelo en su servidor:

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

A continuación, establezca una ruta en su archivo php.ini, por ejemplo, en Windows:

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

Desactivar CURLOPT_SSL_VERIFYPEER permite ataques de hombre en el medio (MITM), ¡lo cual no quiere!


Otra opción como la respuesta de Gavin Palmer es usar el archivo .pem pero con una opción de curl

1- descarga el último archivo .pem actualizado de https://curl.haxx.se/docs/caextract.html y .pem en algún lugar de tu servidor (fuera de la carpeta pública)

2- establece la opción en tu código en lugar del archivo php.ini

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


Solución rápida, agregue esto en sus opciones:

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false)

o solo agrégalo a tu función actual:

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