PHP CURL y HTTPS
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://. ¿Alguna idea de lo que debo hacer para que esto funcione para https? ¡Gracias!
Solución rápida, agregue esto en sus opciones:
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false)
En esta situación, no tienes idea de a qué host te estás conectando realmente, porque cURL no verificará el certificado de ninguna manera. ¡Esto no es recomendable y lo dejará expuesto a ataques de intermediarios !
O simplemente agréguelo a su 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;
}
Estaba intentando usar CURL para realizar algunas llamadas a la API https con php y me encontré con este problema. Noté una recomendación en el sitio php que me ayudó a ponerme en marcha: http://php.net/manual/en/function.curl-setopt.php#110457
Por favor, dejen de configurar CURLOPT_SSL_VERIFYPEER en falso o 0. Si su instalación de PHP no tiene un paquete de certificado raíz de CA actualizado, descargue el del sitio web de curl y guárdelo en su servidor:
http://curl.haxx.se/docs/caextract.html
Luego 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 intermediario (MITM), ¡lo cual no deseas!
Otra opción como la respuesta de Gavin Palmer es usar el .pem
archivo pero con una opción curl
descargue el último archivo actualizado
.pem
desde https://curl.haxx.se/docs/caextract.html y guárdelo en algún lugar de su servidor (fuera de la carpeta pública)configure la opción en su código en lugar del
php.ini
archivo.
en tu codigo
curl_setopt($ch, CURLOPT_CAINFO, $_SERVER['DOCUMENT_ROOT'] . "/../cacert-2017-09-20.pem");
NOTA: configurar cainfo como lo php.ini
hizo @Gavin Palmer es mejor que configurarlo en su código como lo hice yo, porque guardará una E/S de disco cada vez que se llame a la función, solo lo hago así en caso de que quiera probar el archivo cainfo sobre la marcha en lugar de cambiarlo php.ini
mientras prueba su función.
Una nota importante: la solución mencionada anteriormente no funcionará en el host local, debe cargar su código en el servidor y luego funcionará. No recibí ningún error, solo una solicitud incorrecta, el problema era que estaba usando localhost (test.dev, myproject.git). Ambas soluciones anteriores funcionan; se recomienda la solución que utiliza un certificado SSL.
Vaya a https://curl.haxx.se/docs/caextract.html y descargue la última versión de cacert.pem. La tienda está en algún lugar (no en una carpeta pública, pero funcionará de todos modos)
Usa este código
".$resultado; //echo "
Ruta:".$_SERVER['DOCUMENT_ROOT'] . "/ssl/cacert.pem"; // ¿esto es solo para solucionar problemas?>
- Cargue el código en el servidor en vivo y pruébelo.