php - ssl3_get_server_certificate - more details here https curl haxx se docs sslcerts html
HTTPS y SSL3_GET_SERVER_CERTIFICATE: error en la verificación del certificado, CA está bien (11)
¡La solución es muy simple! Pon esta línea antes de curl_exec
:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
Para mi funciona.
Estoy usando XAMPP para el desarrollo. Recientemente actualicé mi instalación de xampp de una versión anterior a 1.7.3.
Ahora cuando rizo los sitios habilitados para HTTPS obtengo la siguiente excepción
Error fatal: excepción no detectada ''RequestCore_Exception'' con mensaje ''recurso de CURS: ID de recurso # 55; Error cURL: problema con el certificado SSL, verifique que el certificado CA esté bien. Detalles: error: 14090086: Rutinas SSL: SSL3_GET_SERVER_CERTIFICATE: error en la verificación del certificado (60) ''
Todo el mundo sugiere usar algunas opciones de curvatura específicas 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 descubrir qué cambios en la configuración de mi instalación de PHP, Apache, etc. puede solucionar este problema.
A veces, si la aplicación que intenta contactar tiene certificados autofirmados, el cacert.pem normal de http://curl.haxx.se/ca/cacert.pem no resuelve el problema.
Si está seguro acerca de la URL del punto final del servicio, péguelo a través del navegador, guarde el certificado manualmente en formato "X 509 certificado con cadena (PEM)". Apunte este archivo de certificado con el
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/{downloaded certificate chain file}");
Al configurar las opciones de rizo para CURLOPT_CAINFO, recuerde usar comillas simples, usar comillas dobles solo causará otro error. Entonces tu opción debería ser como:
curl_setopt ($ch, CURLOPT_CAINFO, ''c:/wamp/www/mywebfolder/cacert.pem'');
Además, en su configuración de archivo php.ini debe escribirse como: (note mis comillas dobles)
curl.cainfo = "C:/wamp/www/mywebfolder"
Lo puse directamente debajo de la línea que dice esto: extension=php_curl.dll
(Solo para fines de organización, puede ponerlo en cualquier lugar dentro de su php.ini
, simplemente lo puse cerca de otra referencia de rizo, de modo que cuando busco utilizando rizo de palabras clave puedo encontrar ambas referencias de rizo en un área).
Es un problema bastante común en Windows. Solo necesitas configurar cacert.pem
para curl.cainfo
.
Desde PHP 5.3.7 podrías hacer:
- descargue https://curl.haxx.se/ca/cacert.pem y guárdelo en algún lugar.
- actualizar
php.ini
- agregar curl.cainfo = "PATH_TO / cacert.pem"
De lo contrario, deberá hacer lo siguiente para cada recurso cURL:
curl_setopt ($ch, CURLOPT_CAINFO, "PATH_TO/cacert.pem");
Las soluciones anteriores son excelentes, pero si está utilizando WampServer, es posible que la configuración de la variable curl.cainfo
en php.ini
no funcione.
Finalmente encontré que WampServer tiene dos archivos php.ini
:
C:/wamp/bin/apache/Apachex.x.x/bin
C:/wamp/bin/php/phpx.x.xx
Aparentemente, el primero se usa para cuando los archivos PHP se invocan 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 archivos php.ini
.
Por el amor de 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 configurar curl.cainfo
en la configuración de PHP es exactamente lo que se necesita, pero en el entorno con el que estoy trabajando, que es el eboraas/laravel acoplable eboraas/laravel , que usa Debian 8 (Jessie ) y PHP 5.6, configurando esa variable no hizo el truco.
Noté que la salida de php -i
no mencionó nada sobre esa configuración de configuración en particular, pero sí tenía algunas líneas sobre openssl
. Hay una opción openssl.capath
y openssl.cafile
, pero solo configurar el segundo permite que el rizo a través de PHP finalmente esté bien con las URL de HTTPS.
Tengo el mismo error en Amazon AMI Linux.
Resolví estableciendo curl.cainfo en /etc/php.d/curl.ini
https://gist.github.com/reinaldomendes/97fb2ce8a606ec813c4b
Adición octubre 2018
En Amazon Linux v1 edita este archivo
vi /etc/php.d/20-curl.ini
Para agregar esta linea
curl.cainfo="/etc/ssl/certs/ca-bundle.crt"
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 mi fue googleapis.com
openssl s_client -host www.googleapis.com -port 443
Recuperará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, su salida de cadena puede parecer diferente.
Entonces necesitas mirar los certificados permitidos en php. Ejecuta 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 deberá corregir agregando los certificados correctos.
sudo nano /usr/local/php5/ssl/certs/cacert.pem
Básicamente, debe adjuntar las "firmas" de certificados correctas al final de este archivo.
Puede encontrar algunos de ellos aquí: Es posible que necesite buscar en Google / buscar otros en la cadena si los necesita.
Se ven así:
( Nota: esta es una imagen para que la gente no simplemente copie / pegue certificados de )
Una vez que los certificados correctos están en este archivo, reinicie apache y pruebe.
el enrollamiento se utiliza para incluir una lista de CA aceptadas, pero ya no incluye CUALQUIER certificado CA. Entonces, por defecto, rechazará todos los certificados SSL como no verificables.
Tendrás que obtener el certificado de tu CA y apuntarlo hacia él. Más detalles en los detalles de cURLS en certificados SSL de servidor .
Advertencia: esto puede introducir problemas de seguridad que SSL está diseñado para proteger contra.
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 desactiva toda verificación de certificados SSL.
Fuente: http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html
Curl: problema del certificado SSL, verifique que el certificado CA esté bien
07 de abril de 2006
Al abrir una URL segura con Curl, puede aparecer el siguiente error:
Problema con el certificado SSL, verifique que el certificado CA esté bien
Te explicaré por qué el error y qué debes hacer al respecto.
La forma más fácil de deshacerse del error sería agregar las siguientes dos líneas a su script. Esta solución plantea un riesgo de seguridad aunque.
//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 que hacen estos dos parámetros. Citando el manual.
CURLOPT_SSL_VERIFYHOST : 1 para verificar la existencia de un nombre común en el certificado de igual SSL. 2 para verificar la existencia de un nombre común y también verificar que coincida con el nombre de host proporcionado.
CURLOPT_SSL_VERIFYPEER : FALSE para evitar que CURL verifique el certificado del igual. Se pueden especificar certificados alternativos contra los que se puede verificar con la opción CURLOPT_CAINFO o se puede especificar un directorio de certificado con la opción CURLOPT_CAPATH. CURLOPT_SSL_VERIFYHOST también debe ser VERDADERO o FALSO si CURLOPT_SSL_VERIFYPEER está deshabilitado (su valor predeterminado es 2). Establecer CURLOPT_SSL_VERIFYHOST en 2 (este es el valor predeterminado) garantiza que el certificado que se le presenta tiene un ''nombre común'' que coincide con la URN que está usando para acceder al recurso remoto. Este es un cheque saludable, pero no garantiza que su programa no se esté eliminando.
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 arp poisoning (esta es una historia para otro día). El intruso también puede autofirmar un certificado con el mismo ''nombre común'' que su programa espera. La comunicación aún estaría encriptada, pero estaría revelando sus secretos a un impostor. Este tipo de ataque se llama ''hombre en el medio''
Derrotando al ''hombre en el medio''
Bueno, tenemos que verificar que el certificado que se nos presenta sea bueno de verdad. Hacemos esto comparándolo con un certificado en el que razonablemente confiamos *.
Si el recurso remoto está protegido por un certificado emitido por una de las CA principales como Verisign, GeoTrust et al, puede compararlo de manera segura con 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 configure las siguientes opciones en su script.
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE); curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");
Para todo lo anterior, el crédito de información va a: http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html