cURL error 60: certificado SSL: no se puede obtener el certificado de emisor local


232

Uso WAMP en un entorno de desarrollo local y estoy tratando de cargar una tarjeta de crédito pero aparece el mensaje de error:

error 60 de cURL: problema con el certificado SSL: no se puede obtener el certificado de emisor local

Busqué mucho en Google y mucha gente sugiere que descargue este archivo: cacert.pem , lo coloque en algún lugar y lo consulte en mi php.ini. Esta es la parte en mi php.ini:

curl.cainfo = "C:\Windows\cacert.pem"

Sin embargo, incluso después de reiniciar mi servidor varias veces y cambiar la ruta, recibo el mismo mensaje de error.

Uso WAMP de los módulos de Apache y tengo el ssl_module habilitado. Y de las extensiones PGP tengo php_curl habilitado.

Sigue siendo el mismo mensaje de error. ¿Por qué está pasando eso?

Ahora estoy siguiendo esta solución: Cómo reparar PHP CURL Error 60 SSL

Lo que sugiere que agregue estas líneas a mis opciones de cURL:

curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, true);

¿Dónde agrego opciones a mi cURL? Aparentemente no a través de la línea de comando, ya que mi CLI no encuentra el comando "curl_setopt"

EDITAR

Este es el código que estoy ejecutando:

public function chargeStripe()
{
    $stripe = new Stripe;
    $stripe = Stripe::make(env('STRIPE_PUBLIC_KEY'));

    $charge = $stripe->charges()->create([
        'amount'   => 2900,
        'customer' => Input::get('stripeEmail'),
        'currency' => 'EUR',
    ]);

    dd($charge);

    // echo $charge[Input::get('stripeToken')];


    return Redirect::route('step1');
}

Suponiendo que no haya problemas con su código, podría ser su firewall. Intente deshabilitar su firewall para probar.
Waqar ul islam

¿No te di la respuesta a esta pregunta aquí ? :)
Limon Monte

@limonte posible, tuvo que cambiar de proyecto y probablemente tenga el mismo problema con el nuevo proyecto. Volverá al problema de Guzzle y tal vez sea la misma solución. brb
LoveAndHappiness

1
¿Has probado la última versión de stripe? Veo un mensaje de confirmación que cambió algo que ver con certs ... github.com/stripe/stripe-php/commit/…
thelastshadow

1
@LoveAndHappiness, ¿tienes la solución para este problema? Estoy enfrentando el mismo error con stripe. Avísame si tienes alguna solución.
Dev

Respuestas:


516

Solución de trabajo asumiendo su en Windows usando XAMPP:

Servidor XAMPP

  1. Similar para otro ambiente
    • descargue y extraiga para cacert.pem aquí (un formato de archivo limpio / datos)

https://curl.haxx.se/docs/caextract.html

  1. Ponlo aquí en el siguiente directorio.

C: \ xampp \ php \ extras \ ssl \ cacert.pem

  1. En su php.ini ponga esta línea en esta sección ("c: \ xampp \ php \ php.ini"):
;;;;;;;;;;;;;;;;;;;;
; php.ini Options  ;
;;;;;;;;;;;;;;;;;;;;

curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"
  1. Reinicie su servidor web / apache

  2. ¡Problema resuelto!

(Referencia: https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate )


66
Este mensaje llega debido a su versión de PHP. Si es superior a PHP 5.5, entonces aparece este error debido a la nueva característica de PHP 5.6. PHP 5.6 verifique los certificados si está utilizando cURL.
UWU_SANDUN

99
¡Gracias por la respuesta! Aunque recomendaría usar cacert.pem de la página oficial de curl: curl.haxx.se/docs/caextract.html
dieBeiden

66
Solo quería señalar a cualquiera que no pueda hacer que esto funcione: utilicé barras diagonales curl.cainfo = "C:/cacert.pem"y también tuve que reiniciar mi computadora para que funcione. Simplemente reiniciar el servidor web no fue suficiente. Esperemos que eso ayude:]
space_food_

1
y no te olvides de comentar curl.cainfo(facepalm)
Edmund Sulzanok

¡Trabajado como un encanto! Gracias
Jack

56

Atención usuarios de Wamp / Wordpress / windows. Tuve este problema durante horas y ni siquiera la respuesta correcta lo estaba haciendo por mí, porque estaba editando el archivo php.ini incorrecto porque la pregunta se respondió a XAMPP y no para los usuarios de WAMP, a pesar de que la pregunta era para WAMP.

esto es lo que hice

Descargar el paquete de certificados.

Ponlo dentro de C:\wamp64\bin\php\your php version\extras\ssl

Asegúrese de que el archivo mod_ssl.so esté dentro deC:\wamp64\bin\apache\apache(version)\modules

Habilitar mod_sslenhttpd.conf el interior del directorio de ApacheC:\wamp64\bin\apache\apache2.4.27\conf

Habilitar php_openssl.dllen php.ini. Tenga en cuenta que mi problema es que tenía dos archivos php.ini y necesito hacer esto en ambos. El primero puede ubicarse dentro del icono de la barra de tareas de WAMP aquí.

ingrese la descripción de la imagen aquí

y el otro se encuentra en C:\wamp64\bin\php\php(Version)

encuentre la ubicación de ambos php.iniarchivos y encuentre la línea curl.cainfo =y déle una ruta como esta

curl.cainfo = "C:\wamp64\bin\php\php(Version)\extras\ssl\cacert.pem"

Ahora guarde los archivos y reinicie su servidor y debería estar listo para comenzar


Es menos que tenga que hacer ambos php.ini que hacer el que tiene la intención de usar: si está usando apache como cliente SAPI, modifique el que está en el directorio apache y / o modifique el que está en el cliente dir si está planeando usar php.exe como SAPI.
Fabien Haddadi

3
"Necesito hacer esto en ambos" es la nota clave. Gracias
Jaroslav Klimčík

1
Esto funciona para Laravel 5.5 con "guzzlehttp / guzzle": "^ 6.3". Servidor Wamp 3.1.3. Php 7.1 *
Deepesh Thapa

Esto funcionó. Gracias
user4906240

Gracias por responder por wamp
altoids

46

Si está usando PHP 5.6 con Guzzle, Guzzle ha cambiado a usar las bibliotecas PHP autodetectadas para certificados en lugar de su proceso ( ref ). PHP describe los cambios aquí .

Averiguar dónde PHP / Guzzle está buscando certificados

Puede volcar donde PHP está buscando usando:

 var_dump(openssl_get_cert_locations());

Obtener un paquete de certificados

Para las pruebas de OS X, puede usar homebrew para instalar openssl brew install openssly luego usarlo openssl.cafile=/usr/local/etc/openssl/cert.pemen la configuración de su servidor php.ini o Zend (en OpenSSL).

También está disponible un paquete de certificados de curl / Mozilla en el sitio web de curl: https://curl.haxx.se/docs/caextract.html

Decirle a PHP dónde están los certificados

Una vez que tenga un paquete, colóquelo donde PHP ya está buscando (que descubrió anteriormente) o actualice openssl.cafileen php.ini. (Generalmente, /etc/php.inio /etc/php/7.0/cli/php.inio /etc/php/php.inien Unix).


3
SI. Después de ver a muchas personas sugerir el enfoque obviamente incorrecto de degradar por múltiples números de versión, este es el enfoque correcto en mi humilde opinión. Había seguido los consejos de otros sobre el café pero no tenía medios para probar por qué todavía no se cargaba. Esta función openssl_get_cert_locations () realmente hizo el trabajo al identificar mi problema. ¡Gracias!
Web y Flow

1
Gracias por proporcionarnos openssl_get_cert_locations, facilitó la depuración. Parece que WAMP usa un archivo ini diferente para apache php que para la consola php. En mi caso, tuve que agregar openssl.cafile="c:/_/cacert.pem"para php basado en consola. La última vez, cuando lo usé a través de Apache, necesitaba curl.cainfo="c:/_/cacert.pem"que funcionara.
psycho brm

16

Guzzle, que es utilizado por cartalyst / stripe , hará lo siguiente para encontrar un archivo de certificado adecuado para verificar un certificado de servidor:

  1. Compruebe si openssl.cafileestá configurado en su archivo php.ini.
  2. Compruebe si curl.cainfoestá configurado en su archivo php.ini.
  3. Verifique si /etc/pki/tls/certs/ca-bundle.crtexiste (Red Hat, CentOS, Fedora; proporcionado por el paquete de certificados ca)
  4. Compruebe si /etc/ssl/certs/ca-certificates.crtexiste (Ubuntu, Debian; proporcionado por el paquete de certificados de ca)
  5. Compruebe si /usr/local/share/certs/ca-root-nss.crtexiste (FreeBSD; proporcionado por el paquete ca_root_nss)
  6. Compruebe si /usr/local/etc/openssl/cert.pem(OS X; proporcionado por homebrew)
  7. Verificar si C:\windows\system32\curl-ca-bundle.crtexiste (Windows)
  8. Verificar si C:\windows\curl-ca-bundle.crtexiste (Windows)

Deberá asegurarse de que los valores de las dos primeras configuraciones estén definidos correctamente mediante una simple prueba:

echo "openssl.cafile: ", ini_get('openssl.cafile'), "\n";
echo "curl.cainfo: ", ini_get('curl.cainfo'), "\n";

Alternativamente, intente escribir el archivo en las ubicaciones indicadas por # 7 u # 8.


13

Si no puede cambiar php.ini, también puede apuntar al archivo cacert.pem de un código como este:

$http = new GuzzleHttp\Client(['verify' => '/path/to/cacert.pem']);
$client = new Google_Client();
$client->setHttpClient($http);

8

Lo que hice fue usar var_dump(openssl_get_cert_locations()); die;cualquier script php, que me dio la información sobre los valores predeterminados que estaba usando mi php local:

array (size=8)
  'default_cert_file' => string 'c:/openssl-1.0.1c/ssl/cert.pem' (length=30)
  'default_cert_file_env' => string 'SSL_CERT_FILE' (length=13)
  'default_cert_dir' => string 'c:/openssl-1.0.1c/ssl/certs' (length=27)
  'default_cert_dir_env' => string 'SSL_CERT_DIR' (length=12)
  'default_private_dir' => string 'c:/openssl-1.0.1c/ssl/private' (length=29)
  'default_default_cert_area' => string 'c:/openssl-1.0.1c/ssl' (length=21)
  'ini_cafile' => string 'E:\xampp\php\extras\ssl\cacert.pem' (length=34)
  'ini_capath' => string '' (length=0)

Como puede observar, he configurado el ini_cafile o la opción ini curl.cainfo. Pero en mi caso, curl intentaría usar el "default_cert_file" que no existía.

Copié el archivo de https://curl.haxx.se/ca/cacert.pem en la ubicación de "default_cert_file" (c: /openssl-1.0.1c/ssl/cert.pem) y pude obtenerlo trabajar.

Esta fue la única solución para mí.


Tengo un problema similar y mi ubicación es algo así como c: /usr/local/ssl/cert.pem pero esta ubicación no existe, ¿sabes qué podría ser? Además, mi coluge en Mac puede usar el mismo proyecto. esa es la razón, he intentado todo lo demás, que es agregar la ubicación del certificado en el archivo .ini pero no funciona, parece que su solución debería funcionar, ya que tiene sentido, pero no puede cambiar esa ubicación y no puede colocar el certificado en ubicación que no existe.
AbdulMueed

¿Puede intentar crear las carpetas y colocar el certificado en la ruta especificada?
George Donev

7

Un día tuve un problema inesperado, cuando un script Guzzle (5) intentaba conectarse a un host a través de SSL. Claro, podría deshabilitar la opción VERIFICAR en Guzzle / Curl, pero claramente esa no es la forma correcta de hacerlo.

Intenté todo lo que aparece aquí y en subprocesos similares, luego finalmente fui a la terminal con openssl para probar el dominio con el que estaba tratando de conectarme:

openssl s_client -connect example.com:443 

... y recibió las primeras líneas que indican:

CONNECTED(00000003)
depth=0 CN = example.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = example.com
verify error:num=21:unable to verify the first certificate
verify return:1 

... mientras que todo funcionó bien al probar otros destinos (es decir: google.com, etc.)

Esto me llevó a contactar el dominio al que había estado tratando de conectarme y, de hecho, tenían un problema en SU ​​FIN que se había deslizado. Se resolvió y mi guión volvió a funcionar.

Entonces ... si te estás sacando el pelo, dale una oportunidad a openssl y mira si hay algo con la respuesta de la ubicación que estás intentando conectar. Quizás el problema no sea tan 'local' después de todo a veces.


6

Encontré una solución que funcionó para mí. Bajé de la última versión a 4.0 ~ y funcionó.

En composer.json agregue "guzzlehttp / guzzle": "~ 4.0"

Espero que ayude a alguien


Eso también le impedirá usar cualquier característica de la versión 5/6. En su lugar, simplemente establezca verificar en falso en una matriz de parámetros (tercer parámetro del método de solicitud): $ cliente-> solicitud ('GET', '/', ['verificar' => falso]);
S ..

3

Asegúrese de abrir el php.iniarchivo directamente con su Explorador de ventanas. (en mi caso:) C:\DevPrograms\wamp64\bin\php\php5.6.25.

No utilice el acceso directo php.inien el menú del icono de Wamp / Xamp en la bandeja del sistema. Este atajo no funciona en este caso.

Luego edite eso php.ini:

curl.cainfo ="C:/DevPrograms/wamp64/bin/php/cacert.pem" 

y

openssl.cafile="C:/DevPrograms/wamp64/bin/php/cacert.pem"

Después de guardar php.ini, no necesita "Reiniciar todos los servicios" en el icono de Wamp o cerrar / volver a abrir CMD.


2

Has probado..

curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);

Si está consumiendo una fuente confiable, posiblemente no necesite verificar el certificado SSL.


2

Pasé demasiado tiempo para resolver este problema por mí.

Tenía PHP versión 5.5 y necesitaba actualizar a 5.6.

En las versiones <5.6 Guzzle usará su propio archivo cacert.pem, pero en las versiones superiores de PHP usará el archivo cacert.pem del sistema.

También descargué el archivo desde aquí https://curl.haxx.se/docs/caextract.html y lo configuré en php.ini.

Respuesta encontrada en el archivo Guzzles StreamHandler.php https://github.com/guzzle/guzzle/blob/0773d442aa96baf19d7195f14ba6e9c2da11f8ed/src/Handler/StreamHandler.php#L437

        // PHP 5.6 or greater will find the system cert by default. When
        // < 5.6, use the Guzzle bundled cacert.

2

Todas las respuestas son correctas ; pero lo más importante es que debes encontrar el archivo php.ini correcto. marque este comando en cmd "php --ini" no es la respuesta correcta para encontrar el archivo php.ini correcto.

si editas

curl.cainfo ="PATH/cacert.pem"

y verifica

var_dump(openssl_get_cert_locations()); 

entonces curl.cainfo debería tener un valor. si no, entonces ese no es el archivo php.ini correcto;

* Te recomiendo que busques * .ini en wamp / bin o xxamp / bin o en cualquier servidor que uses y cámbialos uno por uno y compruébalo. * *


1

Acabo de experimentar este mismo problema con el framework Laravel 4 php que usa el guzzlehttp/guzzle paquete compositor. Por alguna razón, el certificado SSL para mailgun dejó de validarse de repente y recibí el mismo mensaje de "error 60".

Si, como yo, está en un alojamiento compartido sin acceso php.ini, las otras soluciones no son posibles. En cualquier caso, Guzzle tiene este código de inicialización de cliente que probablemente anularía los php.iniefectos:

// vendor/guzzlehttp/guzzle/src/Client.php
    $settings = [
        'allow_redirects' => true,
        'exceptions'      => true,
        'decode_content'  => true,
        'verify'          => __DIR__ . '/cacert.pem'
    ];

Aquí Guzzle fuerza el uso de su propio archivo interno cacert.pem, que probablemente ahora está desactualizado, en lugar de usar el proporcionado por el entorno de cURL . Cambiar esta línea (al menos en Linux) configura Guzzle para usar la lógica de verificación SSL predeterminada de cURL y solucionó mi problema:

        'verify'          => true

También puede establecer esto en false si no le importa la seguridad de su conexión SSL, pero esa no es una buena solución.

Como los archivos vendorno están destinados a ser manipulados, una mejor solución sería configurar el cliente Guzzle en el uso, pero esto fue demasiado difícil de hacer en Laravel 4.

Espero que esto le ahorre a alguien un par de horas de depuración ...


1

Este podría ser un caso extremo, pero en mi caso el problema no era la configuración del cliente (ya lo había curl.cainfoconfigurado php.ini), sino que el servidor remoto no se configuró correctamente:

No envió ningún certificado intermedio en la cadena. No hubo ningún error al navegar por el sitio usando Chrome, pero con PHP obtuve el siguiente error.

cURL error 60

Después de incluir los certificados intermedios en la configuración remota del servidor web, funcionó.

Puede usar este sitio para verificar la configuración SSL de su servidor:

https://whatsmychaincert.com/


1

cuando corro 'var_dump(php_ini_loaded_file());' me sale este resultado en mi página 'C:\Development\bin\apache\apache2.4.33\bin\php.ini' (length=50)'

y para que php cargue mi archivo cert, tuve que editar el php.ini en esta ruta 'C:\Development\bin\apache\apache2.4.33\bin\php.ini' y agregar openssl.cafile="C:/Development/bin/php/php7.2.4/extras/ssl/cacert.pem"donde había descargado y colocar mi archivo cert desde https://curl.haxx.se/docs/caextract.html

Estoy en Windows 10, usando Drupal 8, Wamp y PHP7.2.4


0

Tengo una solución adecuada para este problema, intentemos comprender la causa raíz de este problema. Este problema se produce cuando los servidores remotos SSL no pueden verificarse utilizando certificados raíz en el almacén de certificados de su sistema o no se instala SSL remoto junto con los certificados de cadena. Si tiene un sistema Linux con acceso ssh raíz, en este caso puede intentar actualizar su almacén de certificados con el siguiente comando:

update-ca-certificates

Si aún así, no funciona, entonces debe agregar el certificado raíz e intermedio del servidor remoto en su tienda de certificados. Puede descargar certificados raíz e intermedios y agregarlos en el directorio / usr / local / share / ca-certificados y luego ejecutar el comando update-ca-certificates. Esto debería funcionar. Del mismo modo, para Windows puede buscar cómo agregar certificados raíz e intermedios.

La otra forma en que puede resolver este problema es pedirle al equipo del servidor remoto que agregue el certificado SSL como un paquete de certificado raíz de dominio, certificado intermedio y certificado raíz.


-1

Como está utilizando Windows, creo que su separador de ruta es '\' (y '/' en Linux). Intenta usar la constante DIRECTORY_SEPARATOR. Tu código será más portátil.

Tratar:

curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . DIRECTORY_SEPARATOR . 'cacert.pem');

EDITAR: y escribe la ruta completa. Tuve algunos problemas con las rutas relativas (¿tal vez curl se ejecuta desde otro directorio base?)


1
Esto no haría una diferencia, porque la configuración real de cURL está fuera de su control cuando usa esa biblioteca particular de Stripe.
Ja͢ck

-1

si usa WAMP, también debe agregar la línea de certificado en php.ini para Apache (además del archivo predeterminado php.ini):

[curl]
curl.cainfo = C:\your_location\cacert.pem

funciona para php5.3 +


¡Si! Tenga cuidado de editar los archivos php.ini de versión de apache y php. Para los usuarios de WAMP, esta respuesta fue la única que resolvió mi problema: stackoverflow.com/questions/28858351/…
MavBzh
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.