¿Cómo trato con certificados usando cURL mientras intento acceder a una URL HTTPS?

188

Recibo el siguiente error al usar curl:

curl: (77) error al establecer el certificado verificar ubicaciones:
  CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: ninguno

¿Cómo configuro este certificado para verificar ubicaciones? Gracias.

moorecats
fuente
2
¿En qué sistema operativo / distribución estás? Debe instalar el paquete ca-certificados (así se llama en debian / ubuntu).
igorw 01 de
40
Para referencia futura, ya había ca-certificatesinstalado pero el error persistió. El problema era que mis certificados estaban ubicados en /etc/ssl/certs/ca-certificates.crtlugar de /etc/pki/tls/certs/ca-bundle.crt, así que solo tenía que establecer la variable ambiental CURL_CA_BUNDLEen la ruta correcta.
Robert Smith
13
¡Frio! Funciona para mí cuando configuro export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt.
ordenado

Respuestas:

83

Este error está relacionado con un paquete que falta : ca-certificates. Instalarlo.

En Ubuntu Linux (y distro similar):

# apt-get install ca-certificates

En CygWin a través de Apt-Cyg

# apt-cyg install ca-certificates

En Arch Linux (Raspberry Pi)

# pacman -S ca-certificates

La documentación dice:

Este paquete incluye archivos PEM de certificados CA para permitir que las aplicaciones basadas en SSL verifiquen la autenticidad de las conexiones SSL.

Como se ve en: Debian: detalles de los certificados ca del paquete en Squeeze

Rubens Mariuzzo
fuente
97
ca-certificados ya es la versión más nueva, pero todavía recibo el error
Pastor Bones
2
Por supuesto, obtendrá este mismo error si intenta instalar apt-cyg mediante el método recomendado usando curl y raw.github.com .
10gistic
11
En Arch Linux, es posible que también lo necesite pacman -S ca-certificates-utils. Yo hice.
Mark Grimes
8
Este paquete ya está instalado. Esta respuesta no es útil.
JimmyJames
9
@PastorBones Tuve el mismo problema que el paquete ya era el último, creo que sin embargo se había dañado, así que sudo apt install --reinstall ca-certificatesreinstalé el paquete y resolví los errores que estaba viendo
será el
153

También tenía instalada la versión más reciente de los certificados ca pero aún recibía el error

curl: (77) error setting certificate verify locations:
  CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none

El problema era que curl esperaba que el certificado estuviera en la ruta /etc/pki/tls/certs/ca-bundle.crtpero no pudo encontrarlo porque estaba en la ruta /etc/ssl/certs/ca-certificates.crt.

Copiar mi certificado al destino esperado ejecutando

sudo cp /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt

trabajó para mi. Deberá crear carpetas para el destino de destino si no existen ejecutando

sudo mkdir -p /etc/pki/tls/certs

Si es necesario, modifique el comando anterior para que el nombre del archivo de destino coincida con la ruta esperada por curl, es decir, reemplácelo /etc/pki/tls/certs/ca-bundle.crtcon la ruta siguiente "CAfile:" en su mensaje de error.

Scott Emmons
fuente
31
También puede crear un enlace simbólico ln -ssi no desea volver a copiarlo cada vez que lo actualice.
starbeamrainbowlabs
44
Tuve el mismo problema para la rescuetimeaplicación en Fedora 25. sudo ln -s /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-certificates.crtresolvió el problema. ( CURL_CA_BUNDLEenv var no funcionó)
GabLeRoux
En mi ubuntu esto esté arreglado el tema: sudo ln -s /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.pem. En realidad estaba obteniendo lo The repository ... does not have a Release fileque fue causado por la falta de certificado ( Could not load certificates from ...).
Marinos An
84

Pon esto en tu .bashrc

# fix CURL certificates path
export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt

(ver comentario de Robert)

Yauhen Yakimovich
fuente
8
¡Gracias por proporcionar un método que no requiere que elimine los archivos del sistema a mano, pero que aún mantiene la seguridad de usar certificados!
Stephen Johnson el
Gracias. Esto resolvió mi problema similar con pyenv & curl. Estaba usando Ubuntu 14.04 y ya tenía certificados ca instalados.
davidA
Este enfoque también funciona con xonsh (agregar $CURL_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt"a .xonshrc).
m00am
Por si acaso: la versión única de esto:CURL_CA_BUNDLE=/path/to/bundle.crt curl http://example.com
jmathew
30

Crea un archivo ~/.curlrccon el siguiente contenido

cacert=/etc/ssl/certs/ca-certificates.crt
Prabeesh
fuente
1
la mejor respuesta, esto funcionó para mí en Linux Mint 17
Santiago
En Mac, funcionó con seguimiento en~/.curlrc cacert=/etc/openssl/cert.pem
amirathi
21

La forma más rápida de evitar el error es agregar la opción -k en algún lugar de su solicitud curl. Esa opción "permite conexiones a citas SSL sin certs". (de curl --help)

Tenga en cuenta que esto puede significar que no está hablando con el punto final que cree que es, ya que están presentando un certificado no firmado por una CA en la que confía.

Por ejemplo:

$ curl -o /usr/bin/apt-cyg https://raw.github.com/cfg/apt-cyg/master/apt-cyg

me dio la siguiente respuesta de error:

curl: (77) error setting certificate verify locations:
  CAfile: /usr/ssl/certs/ca-bundle.crt
  CApath: none

Agregué en -k:

curl -o /usr/bin/apt-cyg https://raw.github.com/cfg/apt-cyg/master/apt-cyg -k

y sin mensaje de error. Como beneficio adicional, ahora tengo instalado apt-cyg. Y ca-certificados.

10gistic
fuente
10
Eso podría evitar el error, pero también hace que la conexión "segura" se vuelva insegura.
Tim
1
Realmente no. Hasta donde yo sé, no se puede pasar por alto el cifrado de una conexión segura, por lo que sigue cifrado y va a un solo punto final. Alguien me corrige si me equivoco, pero el único riesgo que corres es que podrías ser presa de un ataque de hombre en el medio. Aún no es probable que sea un riesgo si está usando curl.
10gistic
18
Sí, en serio. La opción "-k" es la abreviatura de "--seguro". Si tienes un hombre en el medio, ¿qué crees que está haciendo con tus datos? Alerta de spoiler: lo descifra, lo roba y posiblemente lo modifica e inyecta nuevamente en la secuencia insegura. Directamente desde la página de manual: "-k, --seguro (SSL) Esta opción permite explícitamente que curl realice conexiones y transferencias SSL" inseguras ". Se intenta asegurar todas las conexiones SSL utilizando el paquete de certificados CA instalado de manera predeterminada. Esto hace que todas las conexiones consideradas "inseguras" fallen a menos que se use -k, --seguro ".
Tim
2
Si necesita SSL, necesita privacidad y verificación: la -kbandera significa que está perdiendo la verificación. Dependiendo de sus necesidades, esto puede ser aceptable. Los MITM son ataques no triviales si asume que su red y el servidor con el que se está comunicando están protegidos de intrusos (¿puede suponer eso?). El riesgo aumenta según el tipo de datos (el código fuente y los certificados son más riesgosos que las imágenes). Puede verificar la integridad de los datos después de la transferencia (sumas de verificación, etc.) pero ahora está cambiando su confianza en ese canal de suma de verificación. Al final -kte da un poco más de trabajo.
Mark Fox
Entonces, ¿significa que si estoy usando un certificado autofirmado? Debería estar usando la opción -k. Como puede no ser posible verificar el certificado autofirmado?
Linus
15

@roens es correcto. Esto afecta a todos los usuarios de Anaconda , con el siguiente error
curl: (77) error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none

La solución consiste en utilizar el sistema de rizo predeterminado y evitar jugar con la PATHvariable Anaconda antepuesta . Tu también puedes

  1. Cambie el nombre del binario curl Anaconda :)
    mv /path/to/anaconda/bin/curl /path/to/anaconda/bin/curl_anaconda

  2. O eliminar el rizo Anaconda
    conda remove curl

$ which curl /usr/bin/curl

[0] Anaconda Ubuntu curl problema de Github https://github.com/conda/conda-recipes/issues/352

Harsha Manjunath
fuente
Buen descubrimiento, no me di cuenta de que Anaconda estaba robando mi camino de precedencia. Funcionó una vez que lo reemplacé curlpor el camino completo/usr/bin/curl
jxramos
¡Esto ayudó mucho! Gracias.
Shababb Karim
12

De $ man curl:

--cert-type <type>
    (SSL) Tells curl what certificate type the provided  certificate
    is in. PEM, DER and ENG are recognized types.  If not specified,
    PEM is assumed.

    If this option is used several times, the last one will be used.

--cacert <CA certificate>
    (SSL) Tells curl to use the specified certificate file to verify
    the peer. The file may contain  multiple  CA  certificates.  The
    certificate(s)  must be in PEM format. Normally curl is built to
    use a default file for this, so this option is typically used to
    alter that default file.
Purnachandar Rao Voleti
fuente
7

Para el código PHP que se ejecuta en XAMPP en Windows, descubrí que necesitaba editar php.ini para incluir lo siguiente

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo = curl-ca-bundle.crt

y luego copie en un archivo https://curl.haxx.se/ca/cacert.pem y cambie el nombre a curl-ca-bundle.crt y colóquelo en la ruta \ xampp (no pude hacer que curl.capath funcione) . También encontré que CAbundle en el sitio cURL no era suficiente para el sitio remoto al que me estaba conectando, así que utilicé uno que aparece con una versión precompilada de Windows de curl 7.47.1 en http://winampplugins.co.uk /rizo/

LJT
fuente
En Windows, también puede agregar "xampp" antes de php, así: curl.cainfo = "C: \ xampp \ php \ extras \ cacert.pem"
Ryan Steyn
7

Tuve exactamente el mismo problema. Como resultado, mi /etc/ssl/certs/ca-certificates.crtarchivo estaba mal formado. La última entrada mostró algo como esto:

-----BEGIN CERTIFICATE-----
MIIEDTCCAvWgAwIBAgIJAN..lots of certificate text....AwIBAgIJAN-----END CERTIFICATE-----

Después de agregar una nueva línea antes -----END CERTIFICATE-----, curl pudo manejar el archivo de certificados.

Fue muy molesto descubrirlo ya que mi update-ca-certificatescomando no me dio ninguna advertencia.

Esto puede o no ser un problema específico de la versión de curl, así que aquí está mi versión, solo para completar:

curl --version
# curl 7.51.0 (x86_64-alpine-linux-musl) libcurl/7.51.0 OpenSSL/1.0.2j zlib/1.2.8 libssh2/1.7.0
# Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp 
# Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP UnixSockets 
Camarones
fuente
6

Esto funciono para mi

sudo apt-get install ca-certificates

luego vaya a la carpeta de certificados en

sudo cd /etc/ssl/certs

luego copie el archivo ca-certificados.crt en el /etc/pki/tls/certs

sudo cp ca-certificates.crt /etc/pki/tls/certs

si no hay una carpeta tls / certs: cree una y cambie los permisos usando chmod 777 -R folderNAME

Kwame Yeboah
fuente
1
Intenté esto, pero esto no funcionó para mí y todavía recibo el mismo error. Algunas ideas ?
Anirudh
6

Otra alternativa para solucionar este problema es deshabilitar la validación del certificado:

echo insecure >> ~/.curlrc
Pablo R. Mier
fuente
1
Solución alternativa, pero me ayuda después de demasiado tiempo con certificados curl. Gracias.
K. Gol
4

curl realiza la SSLverificación de certificados de forma predeterminada, utilizando un "paquete" de Certificate Authority (CA)claves públicas ( certificados de CA). El paquete predeterminado se llama curl-ca-bundle.crt; puede especificar un archivo alternativo usando la opción --cacert.

Si este HTTPSservidor usa un certificado firmado por una CA representada en el paquete, la verificación del certificado probablemente falló debido a un problema con el certificado (podría expirar o el nombre podría no coincidir con el nombre de dominio en la URL).

Si desea desactivar la verificación de curl del certificado, use la --insecureopción -k (o ).

por ejemplo

curl --insecure http://........
meda
fuente
3
Solo un lado que "confiar en la fuente" es bastante irrelevante aquí, ya que sin validar adecuadamente el certificado contra una CA, no tienes idea de quién es "la fuente".
Jeff Allen
4

Parece que su curl apunta a un archivo no existente con certificados de CA o similar.

Para obtener la referencia principal sobre los certificados de CA con curl, consulte: https://curl.haxx.se/docs/sslcerts.html

Daniel Stenberg
fuente
3

Simplemente cree las carpetas, que faltan en su sistema.

/ etc / pki / tls / certs /

y crea el archivo usando el siguiente comando,

sudo apt-get install ca-certificados

y luego copie y pegue el certificado en la carpeta de destino, que se muestra en su error ... el mío fue " with message 'error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none' in" asegúrese de pegar el archivo en la ubicación exacta mencionada en el error. Use el siguiente comando para copiar pegar ..

sudo cp /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt

Fijo.

Manu RS
fuente
¡Ninguna de las mejores respuestas funcionó para mí pero esto sí!
Prachiti Prakash Prabhu
2

Por lo que vale, la verificación que which curlse está ejecutando también es importante.

Un usuario en una máquina compartida que mantengo había recibido este error. Pero la causa resultó ser porque habían instalado Anaconda ( http://continuum.io ). Al hacerlo, la ruta binaria de Anaconda es anterior al estándar $PATH, y viene con su propio curlbinario, que tuvo problemas para encontrar los certificados predeterminados que se instalaron en esta máquina Ubuntu.

roens
fuente
1
Recomiendo verificar which -a curlpara ver todo lo que está disponible y, por supuesto, señalar cuál es el primero.
jxramos
2

Si alguien todavía tiene problemas, intente esto, funcionó para mí. Elimine los archivos en su /etc/ssl/certs/directorio y luego reinstale los certificados ca:

sudo apt install ca-certificates --reinstall

Hice esto cuando intenté instalar Linuxbrew.

Michael Enitan
fuente
1
Esto me ayudó, pero no eliminé los archivos de mi máquina. Simplemente ejecuté el comando simple y curl comenzó a funcionar.
Josefhu15
1

Si está utilizando homebrew en macOS o linuxbrew en linux, intente reinstalar el openssly curlcon los siguientes pasos desde esta página .

Este mensaje de error indica que curl no puede establecer una conexión segura con openssl. Una reinstalación de openssl debería solucionar el problema. Para utilizar temporalmente una conexión insegura para curl y git para descargar los archivos necesarios, ejecute:

echo insecure >> ~/.curlrc
git config --global http.sslVerify false

Luego, instale o reinstale openssl y curl:

HOMEBREW_CURLRC=1 brew reinstall openssl curl

Finalmente, deshaga los cambios de seguridad para hacer que curl y git usen conexiones seguras nuevamente:

sed -i '/^insecure$/d' ~/.curlrc
git config --global http.sslVerify true

Es posible que deba iniciar una nueva sesión de shell para verificar el resultado con

curl -v https://github.com # or any other https urls.

Si muestra la siguiente salida en la salida, ¡el problema debería resolverse!

* successfully set certificate verify locations:
*   CAfile: /usr/local/etc/openssl/cert.pem
    CApath: /usr/local/etc/openssl/certs

Referencias

Itachi
fuente
Después de horas de intentarlo. Esto me salvó. La solución correcta para macos finalmente. ¡Muchas gracias! :)
mrateb
1

Tengo el mismo problema: estoy construyendo una imagen acoplable basada en alpinos, y cuando quiero ir a un sitio web de mi organización, aparece este error. Para resolverlo, tengo que obtener el certificado CA de mi empresa, luego, tengo que agregarlo a los certificados CA de mi imagen.

Obtenga el certificado de CA

Use OpenSSL para obtener los certificados relacionados con el sitio web:

openssl s_client -showcerts -servername my.company.website.org -connect my.company.website.org:443

Esto generará algo como:

CONNECTED(00000005)
depth=2 CN = UbisoftRootCA
verify error:num=19:self signed certificate in certificate chain
...
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
... 
-----END CERTIFICATE-----
...

Obtenga el último certificado (se incluye el contenido entre el -----BEGIN CERTIFICATE-----y las
-----END CERTIFICATE-----marcas) y guárdelo en un archivo (mycompanyRootCA.crt, por ejemplo)

Construye tu imagen

Luego, cuando construyas tu imagen acoplable desde alpine, haz lo siguiente:

FROM alpine
RUN apk add ca-certificates curl
COPY mycompanyRootCA.crt  /usr/local/share/ca-certificates/mycompanyRootCA.crt
RUN update-ca-certificates

¡Tu imagen ahora funcionará correctamente! \ o /

alphayax
fuente
1

Solo encuentra que esta solución funciona perfectamente para mí.

echo 'cacert=/etc/ssl/certs/ca-certificates.crt' > ~/.curlrc

Encontré esta solución desde aquí

Daniel
fuente
0

El error se debe a archivos de certificado de cadena SSL dañados o faltantes en el directorio PKI. Deberá asegurarse de que los archivos se agrupen, siguiendo los pasos: En su consola / terminal:

mkdir /usr/src/ca-certificates && cd /usr/src/ca-certificates

Ingrese a este sitio: https://rpmfind.net/linux/rpm2html/search.php?query=ca-certificates , obtenga su certificado ca, para SO. Copie la url de descarga y péguela en la url: wget your_url_donwload_ca-ceritificated.rpm ahora, instale sus rpm:

rpm2cpio your_url_donwload_ca-ceritificated.rpm | cpio -idmv

ahora reinicie su servicio: mi ejemplo, este comando:

sudo service2 httpd restart
Santos L. Victor
fuente
0

Ejecute el siguiente comando en git bash que funciona bien para mí

git config --global http.sslverify "false"
J4cK
fuente
0

Esto me solucionó:

curl --remote-name --time-cond cacert.pem \
    https://curl.haxx.se/ca/cacert.pem
Reza Farshi
fuente
0

A continuación, describa los pasos para solucionar los problemas.
1. Descubra que el archivo existe en la url de definición.
2. Si no, descargue el archivo de la url. https://curl.haxx.se/ca/cacert.pem
3. Copie y plague el archivo en la ruta definida en el archivo php.ini.
4. Reinicie el servicio apache.

tapas talukder
fuente
0

Tuve este problema y resultó que mi versión de CURL no podía analizar los certificados codificados DER (y tampoco estaba prestando atención a la opción --cert-type). Cuando convertí el certificado al formato PEM, funcionó.

Joshua Davies
fuente
0

En mi caso /etc/ssl/certs/ca-certificates.crtfaltaba el archivo. Al final resultó que he eliminado el contenido de /etc/ssl/certsdentro del Dockerfile al construir la imagen de Docker. Después de ajustar mis scripts de shell / comandos bash ejecutados desde el Dockerfile, curl funciona ahora perfectamente desde el nuevo contenedor.

Nómada de la tecnología
fuente