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