HTTPS y SSL3 OBTENER CERTIFICADO DEL SERVIDOR: certificado de verificación falló, CA está bien


Estoy usando XAMPP para el desarrollo. Recientemente he actualizado mi instalación de xampp de una versión antigua a 1.7.3.

Ahora cuando curl HTTPS sitios habilitados obtengo la siguiente excepción

Error fatal: Excepción no capturada 'RequestCore_Exception' con mensaje Recurso cURL: Recurso id # 55; Error cURL: problema con el certificado SSL, compruebe que el certificado de la CA está bien. Detalles: error: 14090086: rutinas SSL: SSL3_GET_SERVER_CERTIFICATE: certificate verify fallo (60) "

Todos sugieren usar algunas opciones específicas de curl del código PHP para solucionar este problema. Creo que este no debería ser el camino. Porque no tuve ningún problema con mi versión anterior de XAMPP y sucedió solo después de instalar la nueva versión.

Necesito ayuda para averiguar qué ajustes cambian en mi instalación de PHP, Apache etc. puede solucionar este problema.

Author: Uwe Keim, 2011-06-19

11 answers

Curl solía incluir una lista de CA aceptadas, pero ya no agrupaba NINGÚN certificado de CA. Así que por defecto rechazará todos los certificados SSL como no verificables.

Tendrás que obtener el certificado de tu CA y apuntarlo. Más detalles en cURLS Detalles en los Certificados SSL de servidor.

 142
Author: Marc B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-22 23:32:38

Es un problema bastante común en Windows. Solo necesita establecer cacert.pem a curl.cainfo.

Desde PHP 5.3.7 se puede hacer:

  1. descargar https://curl.haxx.se/ca/cacert.pem y guárdalo en algún lugar.
  2. update php.ini add add curl.cainfo = " PATH_TO/cacert.pem "

De lo contrario, tendrá que hacer lo siguiente para cada recurso cURL:

curl_setopt ($ch, CURLOPT_CAINFO, "PATH_TO/cacert.pem");
 281
Author: Артур Курицын,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-31 16:24:32

Advertencia: esto puede introducir problemas de seguridad contra los que SSL está diseñado para proteger.

Pero una solución realmente simple que funcionó para mí fue llamar:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Antes de llamar:

curl_exec():

En el archivo php.

Creo que esto deshabilita toda verificación de certificados SSL.

 81
Author: Chris Dutrow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-25 01:27:23

Fuente: http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html

Curl: problema del certificado SSL, verifique que el certificado de CA esté bien

07 de abril de 2006

Al abrir una url segura con Curl, puede obtener el siguiente error:

Problema del certificado SSL, verifique que el certificado de CA esté bien

Voy a explicar por qué el error y lo que debe hacer al respecto.

La forma más fácil de deshacerse de el error sería agregar el siguiendo dos líneas a tu guión . Esta solución plantea una seguridad riesgo tho.

//WARNING: this would prevent curl from detecting a 'man in the middle' attack
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); 

Veamos lo que hacen estos dos parámetros. Citando el manual.

CURLOPT_SSL_VERIFYHOST: 1 para comprobar la existencia de un nombre común en el certificado de pares SSL. 2 para comprobar la existencia de un nombre común y también verifique que coincida con el nombre de host proporcionado.

CURLOPT_SSL_VERIFYPEER : FALSE para evitar que CURL verifique la certificado de pares. Los certificados alternativos para verificar pueden ser especificado con la opción CURLOPT_CAINFO o un directorio de certificados se puede especificar con la opción CURLOPT_CAPATH. CURLOPT_SSL_VERIFYHOST también puede necesitar ser VERDADERO o FALSO si CURLOPT_SSL_VERIFYPEER está deshabilitado (el valor predeterminado es 2). Configuración CURLOPT_SSL_VERIFYHOST a 2 (Este es el valor predeterminado) garantizará que el certificado que se le presenta tiene un 'nombre común' coincidencia de la URNA que está utilizando para acceder el recurso remoto. Esto es un chequeo saludable, pero no garantiza que su programa no esté siendo decidido.

Introduzca el 'hombre en el medio'

Su programa podría ser engañado para hablar con otro servidor en su lugar. Esto se puede lograr a través de varios mecanismos, como dns o envenenamiento por arp (Esta es una historia para otro día). El intruso puede también auto-firmar un certificado con el mismo' nombre comon ' su programa está esperando. La comunicación seguiría siendo cifrado pero regalar tus secretos a un impostor. Este tipo de ataque es llamado 'hombre en el medio'

Derrotando al 'hombre en el medio'

Bueno, tenemos que verificar el certificado que se nos presenta es bien de verdad. Hacemos esto comparándolo con un certificado que confianza razonable*.

Si el recurso remoto está protegido por un certificado emitido por uno de la CA principal es como Verisign, GeoTrust et al, usted puede con seguridad comparar contra el paquete de certificados de CA de Mozilla que puede obtener de http://curl.haxx.se/docs/caextract.html

Guarde el archivo cacert.pem en algún lugar de su servidor y siguientes opciones en su script.

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE); 
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");

Para toda la Información anterior, el Crédito Va a: http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html

 49
Author: Deepak Oberoi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-07 19:18:25

Las soluciones anteriores son excelentes, pero si está utilizando WampServer puede encontrar que establecer la variable curl.cainfo en php.ini no funciona.

Finalmente encontré que WampServer tiene dos php.ini archivos:

C:\wamp\bin\apache\Apachex.x.x\bin
C:\wamp\bin\php\phpx.x.xx

El primero se usa aparentemente cuando se invocan archivos PHP a través de un navegador web, mientras que el segundo se usa cuando se invoca un comando a través de la línea de comandos o shell_exec().

TL; DR

Si usa WampServer, debe agregar la línea curl.cainfo a ambos php.ini file.

 14
Author: Nate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-07 03:04:34

A veces, si la aplicación con la que intenta contactar tiene certificados autofirmados, el cacert normal.pem de http://curl.haxx.se/ca/cacert.pem no resuelve el problema.

Si está seguro de la url del punto final del servicio, púlsela a través del navegador, guarde el certificado manualmente en el formato "X 509 certificate with chain (PEM)". Apunte este archivo de certificado con el

curl_setopt ($ch, CURLOPT_CAINFO, "pathto/{downloaded certificate chain file}");   
 4
Author: madRai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-18 18:52:16

Al configurar las opciones de curl para CURLOPT_CAINFO, recuerde usar comillas simples, usar comillas dobles solo causará otro error. Así que tu opción debería verse como:

curl_setopt ($ch, CURLOPT_CAINFO, 'c:\wamp\www\mywebfolder\cacert.pem');

Adicionalmente, en su php.la configuración del archivo ini debe escribirse como: (observe mis comillas dobles)

curl.cainfo = "C:\wamp\www\mywebfolder"

Lo pongo directamente debajo de la línea que dice esto: extension=php_curl.dll

(Solo para fines de organización, puedes ponerlo en cualquier lugar dentro de tu php.ini, solo lo coloco cerca de otra referencia de rizo para cuando busco usando palabra clave curl me caan encontrar ambas referencias curl en un área.)

 4
Author: LOwens1931,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-30 16:23:59

Por amor a todo lo que es santo...

En mi caso, tuve que establecer la variable de configuración de PHP openssl.cafile a la ruta del archivo PEM.

Confío en que es muy cierto que hay muchos sistemas donde establecer curl.cainfoen la configuración de PHP es exactamente lo que se necesita, pero en el entorno con el que estoy trabajando, que es el contenedor docker eboraas/laravel, que usa Debian 8 (jessie) y PHP 5.6, establecer esa variable no hizo el truco.

Me di cuenta de que la salida de php -i no mencione cualquier cosa sobre ese ajuste de configuración en particular, pero tenía algunas líneas sobre openssl. Hay ambas opciones openssl.capath y openssl.cafile, pero simplemente configurar la segunda permitió que curl a través de PHP finalmente estuviera bien con las URL HTTPS.

 4
Author: Spencer Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-14 17:23:53

Tengo el mismo error en amazon AMI linux.

Resolví estableciendo curl.cainfo on /etc / php.d / curl.ini

Https://gist.github.com/reinaldomendes/97fb2ce8a606ec813c4b

 2
Author: Reinaldo Mendes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-09 02:43:16

Terminé aquí cuando intentaba obtener GuzzleHttp (php + apache en Mac) para obtener una página de www.googleapis.com.

Aquí estaba mi solución final en caso de que ayude a alguien.

Mire la cadena de certificados para cualquier dominio que le esté dando este error. Para mí fue googleapis.com

openssl s_client -host www.googleapis.com -port 443

Obtendrás algo como esto:

Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.googleapis.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority

Nota: Capturé esto después de solucionar el problema, a la salida de la cadena puede parecer diferente.

Entonces tienes que mirar en los certificados permitidos en php. Ejecute phpinfo () en una página.

<?php echo phpinfo();

Luego busque el archivo de certificado que se carga desde la salida de la página:

openssl.cafile  /usr/local/php5/ssl/certs/cacert.pem

Este es el archivo que tendrá que corregir agregando el certificado correcto.

sudo nano /usr/local/php5/ssl/certs/cacert.pem

Básicamente necesita agregar las "firmas" de certificado correctas al final de este archivo.

Puedes encontrar algunos de ellos aquí: Es posible que necesites buscar en Google/otros en la cadena si lo necesitas ellos.

Se ven así:

ejemplo de imagen de certificado

(Nota: Esta es una imagen para que las personas no simplemente copien / peguen certificados de stackoverflow )

Una vez que los certificados correctos están en este archivo, reinicie apache y test.

 1
Author: TrophyGeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-18 21:45:23

La solución es muy simple! Ponga esta línea antes de curl_exec:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Para mí funciona.

 -3
Author: Zsolt Boszormenyi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-19 09:07:48