php ssl curl wamp stripe-payments

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



wamp stripe-payments (17)

Acabo de experimentar este mismo problema con el framework Laravel 4 php que usa el guzzlehttp/guzzle composer. 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 a php.ini , las otras soluciones no son posibles. En cualquier caso, Guzzle tiene este código de inicialización del cliente que probablemente anularía los efectos php.ini :

// 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.

Dado que los archivos en el vendor no 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 ...

Uso WAMP en un entorno de desarrollo local y estoy tratando de cargar una tarjeta de crédito, pero recibo 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 cacert.pem 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''); }


Asegúrese de abrir el archivo php.ini directamente con su Explorador de Windows. (en mi caso: C:/DevPrograms/wamp64/bin/php/php5.6.25 ).

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

Luego edite ese 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.


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

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

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

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

Habilite mod_ssl en httpd.conf dentro del directorio C:/wamp64/bin/apache/apache2.4.27/conf de Apache C:/wamp64/bin/apache/apache2.4.27/conf

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

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

encuentre la ubicación de ambos archivos php.ini y busque la línea curl.cainfo = y dele 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


Como está utilizando Windows, creo que su separador de ruta es ''/' (y ''/'' en Linux). Intenta usar el 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?)


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


Este podría ser un caso extremo, pero en mi caso el problema no era la configuración del cliente (ya tenía curl.cainfo configurado en php.ini ), sino que el servidor remoto no estaba configurado 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/


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.cafile está configurado en su archivo php.ini.
  2. Compruebe si curl.cainfo está configurado en su archivo php.ini.
  3. Compruebe si /etc/pki/tls/certs/ca-bundle.crt existe (Red Hat, CentOS, Fedora; proporcionado por el paquete de certificados de ca)
  4. Compruebe si /etc/ssl/certs/ca-certificates.crt existe (Ubuntu, Debian; proporcionado por el paquete de certificados de ca)
  5. Compruebe si /usr/local/share/certs/ca-root-nss.crt existe (FreeBSD; proporcionado por el paquete ca_root_nss)
  6. Compruebe si /usr/local/etc/openssl/cert.pem (OS X; proporcionado por homebrew)
  7. Compruebe si C:/windows/system32/curl-ca-bundle.crt existe (Windows)
  8. Compruebe si C:/windows/curl-ca-bundle.crt existe (Windows)

Deberá asegurarse de que los valores para las dos primeras configuraciones se definan 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.


Has probado..

curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);

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


Lo que hice fue usar var_dump(openssl_get_cert_locations()); die; var_dump(openssl_get_cert_locations()); die; en 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 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í.


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


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 here .

Averiguar dónde PHP / Guzzle está buscando certificados

Puedes 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 openssl y luego usar openssl.cafile=/usr/local/etc/openssl/cert.pem en su configuración de php.ini o Zend Server (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.cafile en php.ini. (Generalmente, /etc/php.ini o /etc/php/7.0/cli/php.ini o /etc/php/php.ini en Unix).


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);


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. * *


Un día tuve un problema que apareció de la nada, 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 hilos similares, y 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.


cuando ejecuto ''var_dump(php_ini_loaded_file());'' Obtengo 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 descargué y openssl.cafile="C:/Development/bin/php/php7.2.4/extras/ssl/cacert.pem" mi archivo cert desde https://curl.haxx.se/docs/caextract.html

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


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 +


solución de trabajo:

  • Asumiendo en windows

Servidor XAMPP

similar para otro entorno: descargue y extraiga para cacert.pem aquí (un formato de archivo limpio / datos)

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

  • Pon eso aquí

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

  • 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"

  • reinicie su servidor web / apache

¡Problema resuelto!

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