PHP CURL y HTTPS

Resuelto StackOverflowNewbie asked hace 54 años • 4 respuestas

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!

StackOverflowNewbie avatar Jan 01 '70 08:01 StackOverflowNewbie
Aceptado

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;
}
SystemX17 avatar Dec 07 '2010 01:12 SystemX17

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!

Gavin Palmer avatar Oct 29 '2014 22:10 Gavin Palmer

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

  1. descargue el último archivo actualizado .pemdesde https://curl.haxx.se/docs/caextract.html y guárdelo en algún lugar de su servidor (fuera de la carpeta pública)

  2. configure la opción en su código en lugar del php.iniarchivo.

en tu codigo

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

NOTA: configurar cainfo como lo php.inihizo @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.inimientras prueba su función.

Accountant م avatar Dec 11 '2017 21:12 Accountant م

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.

  1. 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)

  2. Usa este código

".$resultado; //echo "
Ruta:".$_SERVER['DOCUMENT_ROOT'] . "/ssl/cacert.pem"; // ¿esto es solo para solucionar problemas?>
  1. Cargue el código en el servidor en vivo y pruébelo.
TheTechGuy avatar Sep 23 '2019 11:09 TheTechGuy