insecure error curl_setopt cacert php ssl curl certificate

curl_setopt - Error al usar PHP cURL con certificados SSL



curl_setopt https (4)

Ahora que esta pregunta es muy antigua, pero tal vez podría ser útil para algunos usuarios que buscan una respuesta actualmente.

Tengo un problema similar sobre una API con SSL, tengo problemas con CURL (no con los navegadores) mi problema es que acabo de poner el certificado pero no la cadena / paquete ceritifcates. Luego puse eso y las cosas comenzaron a funcionar. Entonces eso es importante para evitar problemas.

Espero que esto pueda ser útil para alguien.

Intento escribir un script PHP usando cURL que puede autorizar a un usuario a través de una página que usa un certificado SSL, además del nombre de usuario y la contraseña, y parece que no puedo pasar la etapa de certificación SSL.

En este caso, curl_setopt($handle, CURLOPT_VERIFYPEER, 0) desafortunadamente no es una opción. El certificado es una parte obligatoria de la autenticación; de lo contrario, aparece el error mencionado en esta otra publicación SO similar .

He intentado algunas ejecuciones de línea de comandos con cURL:

> curl --url https://website

Esto devuelve el (60) SLL certificate problem error de (60) SLL certificate problem . Si ajusto el comando para incluir la opción --cacert :

> curl --url https://website --cacert /path/to/servercert.cer

Funciona bien; el sitio web de autenticación es devuelto

Sin embargo, probé el siguiente código PHP:

$handle = curl_init(); $options = array( CURLOPT_RETURNTRANSFER => false, CURLOPT_HEADER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_SSL_VERIFYHOST => ''0'', CURLOPT_SSL_VERIFYPEER => ''1'', CURLOPT_CAINFO => ''/path/to/servercert.cer'', CURLOPT_USERAGENT => ''Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'', CURLOPT_VERBOSE => true, CURLOPT_URL => ''https://website'' ); curl_setopt_array($handle, $options); curl_exec($handle); if (curl_errno($handle)) { echo ''Error: '' . curl_error($handle); } curl_close($handle);

Hubiera pensado que el código era esencialmente análogo a los comandos del shell, pero en su lugar me recibió el siguiente mensaje de error:

Error: las ubicaciones de verificación de certificado de configuración de error: CAfile: /path/to/servercert.cer CApath: none

He leído toda la literatura que puedo encontrar (particularmente en php.net y curl.haxx) y no puedo encontrar nada que solucione este problema. ¿Alguna sugerencia?

EDITAR : He intentado chmod 777 servercert.cer sin éxito. Sin embargo, al ejecutar el script PHP con el código anterior desde la línea de comandos en lugar del navegador a través de php test.php , funciona perfectamente. ¿Alguna explicación de por qué no funciona en el navegador?

EDIT 2 : Estos votos a la baja sobre las únicas almas lo suficientemente valientes como para responder a esta pregunta se están haciendo viejas. O contribuya con algo significativo o pase por aquí, por favor.


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 yo seguiría siendo curl 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 el 7.18.0, curl incluía un archivo de paquete ca severamente desactualizado que se instaló de manera predeterminada. En la actualidad, los archivos curl no incluyen certificados de ca. Debes obtenerlos en otro lugar. Ver a continuación, por ejemplo.

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

A continuación, enumera una serie de pasos que puedes probar.

Dado que su versión 7.16.3 de curl es anterior a 7.18.0, si no lo ha hecho aún, le recomendaría actualizar sus componentes curl y openssl y luego trabajar a través de 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é una solución, espero que sea útil 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'');

Encontré 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 el directorio accesible (con chmod 755 o 777) y será mejor si el archivo CA está en el mismo directorio con el archivo PHP.


Para elaborar y resumir esto:

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

$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 if (curl_exec($ch) === false) { $result = curl_error($ch); } else { $result = curl_exec($ch); } // Close handle curl_close($ch); return $result;