Saltar al contenido

Error al usar PHP cURL con certificados SSL

Solución:

Debido a que las cosas funcionan a través de la línea de comando pero no a través de php usando curl, entonces perseguiría que curl sea el problema.

De acuerdo con esta URL, http://curl.haxx.se/docs/sslcerts.html, que fue referencia en una publicación SO que citó anteriormente (leyendo la página SSL con CURL (php)) …

“Hasta la versión 7.18.0, curl incluía un archivo de paquete de ca muy desactualizado que se instalaba de forma predeterminada. En estos días, los archivos de curl no incluyen certificados de ca en absoluto. Debe obtenerlos en otro lugar. Consulte a continuación, por ejemplo.

Si el servidor remoto usa un certificado autofirmado, si no instala un paquete de certificado de CA, si el servidor usa un certificado firmado por una CA que no está incluido en el paquete que usa o si el host remoto es un impostor haciéndose pasar por su sitio favorito y desea transferir archivos desde este servidor, realice una de las siguientes acciones: “

Luego pasa a enumerar una serie de pasos que puede probar.

Dado que su versión 7.16.3 de curl es anterior a la 7.18.0, si aún no lo ha hecho, le recomendaría actualizar sus componentes curl y openssl y luego trabajar en la lista mencionada anteriormente.

Después de 6 años de la pregunta, encuentro el mismo problema en un host compartido, y aparentemente no hay una respuesta satisfactoria. Encontré para mí una solución, espero que sea de utilidad para todos.

Puedes probar esta configuración:

curl_setopt($config,CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($config,CURLOPT_SSL_VERIFYPEER,1);
curl_setopt($config,CURLOPT_CAINFO,'ca-bundle.crt');
curl_setopt($config,CURLOPT_CAPATH,'ca-bundle.crt');

Me encontré con el mismo error con @Magsol: Error: error setting certificate verify locations: CAfile: /path/to/servercert.cer CApath: none; así que agregué la cuarta línea para configurar CAPath.

Es trabajo conmigo. Pero tenga en cuenta que el archivo CA debe colocarse en un directorio accesible (con chmod 755 o 777) y será mejor si el archivo CA está en el mismo directorio que el archivo PHP.

Para elaborar y resumir esto:

si tiene un archivo PHP que usa PHP curl y coloca el certificado ca para sus sistemas en el mismo directorio, el siguiente código le dará un impulso

    $url = "https://myserver.mydomain.local/get_somedata.php";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);

//These next lines are for the magic "good cert confirmation"
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_VERBOSE, true);

//for local domains:
//you need to get the pem cert file for the root ca or intermediate CA that you signed all the domain certificates with so that PHP curl can use it...sorry batteries not included
//place the pem or crt ca certificate file in the same directory as the php file for this code to work
    curl_setopt($ch, CURLOPT_CAINFO, __DIR__.'/cafile.pem');
    curl_setopt($ch, CURLOPT_CAPATH, __DIR__.'/cafile.pem');

//DEBUG: remove slashes on the next line to prove "SSL verify" is the cause       
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

//Error handling and return result
    $data = curl_exec($ch);
    if ($data === false) {
        $result = curl_error($ch);
    } else {
        $result = $data;
    }

// Close handle
    curl_close($ch);
    return $result;
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *