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:
Guzzle, que es utilizado por cartalyst/stripe , hará lo siguiente para encontrar un archivo de certificado adecuado para verificar un certificado de servidor:
-
Compruebe si
openssl.cafile
está configurado en su archivo php.ini. -
Compruebe si
curl.cainfo
está configurado en su archivo php.ini. -
Compruebe si
/etc/pki/tls/certs/ca-bundle.crt
existe (Red Hat, CentOS, Fedora; proporcionado por el paquete de certificados de ca) -
Compruebe si
/etc/ssl/certs/ca-certificates.crt
existe (Ubuntu, Debian; proporcionado por el paquete de certificados de ca) -
Compruebe si
/usr/local/share/certs/ca-root-nss.crt
existe (FreeBSD; proporcionado por el paquete ca_root_nss) -
Compruebe si
/usr/local/etc/openssl/cert.pem
(OS X; proporcionado por homebrew) -
Compruebe si
C:/windows/system32/curl-ca-bundle.crt
existe (Windows) -
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)
- 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!