Como faço para lidar com certificados usando cURL ao tentar acessar um URL HTTPS?

187

Estou recebendo o seguinte erro usando curl:

curl: (77) certificado de configuração de erro verificar locais:
  CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: nenhum

Como faço para definir este certificado para verificar locais? Obrigado.

moorecats
fonte
2
Em que OS / distribuição você está? Você deve instalar o pacote ca-certificates (é assim que é chamado no debian / ubuntu).
Igorw 01/07/19
40
Para referência futura, eu já tinha ca-certificatesinstalado, mas o erro persistiu. O problema era que meus certificados estavam localizados em /etc/ssl/certs/ca-certificates.crtvez de /etc/pki/tls/certs/ca-bundle.crt, então eu apenas tive que definir a variável ambiental CURL_CA_BUNDLEpara o caminho correto.
Robert Smith
13
Legal! Funciona para mim quando eu configuro export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt.
arrumado

Respostas:

82

Este erro está relacionado a um pacote que faltava : ca-certificates. Instale-o.

No Ubuntu Linux (e distribuição semelhante):

# apt-get install ca-certificates

No CygWin via Apt-Cyg

# apt-cyg install ca-certificates

No Arch Linux (Raspberry Pi)

# pacman -S ca-certificates

A documentação diz:

Este pacote inclui arquivos PEM de certificados CA para permitir que aplicativos baseados em SSL verifiquem a autenticidade das conexões SSL.

Como visto em: Debian - Detalhes dos certificados ca do pacote no squeeze

Rubens Mariuzzo
fonte
97
ca-certificates já é a versão mais recente, mas eu ainda estou recebendo o erro
Pastor Bones
2
Obviamente, você receberá esse mesmo erro se tentar instalar o apt-cyg através do método recomendado usando curl e raw.github.com .
gistic
11
No Arch Linux, você também pode precisar pacman -S ca-certificates-utils. Eu fiz.
Mark Grimes
8
Este pacote já está instalado. Esta resposta não é útil.
precisa saber é o seguinte
8
@PastorBones Eu tive o mesmo problema que o pacote já foi mais recente, penso que no entanto tinha sido corrompido, para um sudo apt install --reinstall ca-certificatesreinstalado o pacote e resolveu os erros que eu estava vendo
Will
153

Eu também tinha a versão mais recente dos certificados CA instalada, mas ainda estava recebendo o erro:

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

O problema era que o curl esperava que o certificado estivesse no caminho, /etc/pki/tls/certs/ca-bundle.crtmas não conseguiu encontrá-lo porque estava no caminho /etc/ssl/certs/ca-certificates.crt.

Copiando meu certificado para o destino esperado executando

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

trabalhou para mim. Você precisará criar pastas para o destino de destino se elas não existirem executando

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

Se necessário, modifique o comando acima para fazer com que o nome do arquivo de destino corresponda ao caminho esperado por curl, ou seja, substitua /etc/pki/tls/certs/ca-bundle.crtpelo caminho a seguir "CAfile:" na sua mensagem de erro.

Scott Emmons
fonte
31
Você também pode criar um link simbólico ln -sse não quiser copiá-lo novamente toda vez que o atualizar.
starbeamrainbowlabs
4
Teve o mesmo problema para o rescuetimeaplicativo no Fedora 25. sudo ln -s /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-certificates.crtresolveu o problema. ( CURL_CA_BUNDLEEnv var não funcionou)
GabLeRoux
No meu ubuntu esta corrigiu o problema: sudo ln -s /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.pem. Na verdade, eu estava recebendo o The repository ... does not have a Release fileque foi causado pela falta de certificado ( Could not load certificates from ...).
Marinos Em
84

Coloque isso no seu .bashrc

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

(ver comentário de Robert)

Yauhen Yakimovich
fonte
8
Obrigado por fornecer um método que não exija a remoção manual dos arquivos do sistema, mas ainda mantenha a segurança do uso de certificados!
Stephen Johnson
Obrigado. Isso resolveu meu problema semelhante com pyenv & curl. Eu estava usando o Ubuntu 14.04 e já tinha certificados CA instalados.
Davida
Essa abordagem também funciona com o xonsh (adicione $CURL_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt"ao .xonshrc).
M00am 27/11
Apenas no caso de: A versão um forro deste:CURL_CA_BUNDLE=/path/to/bundle.crt curl http://example.com
jmathew
30

Crie um arquivo ~/.curlrccom o seguinte conteúdo

cacert=/etc/ssl/certs/ca-certificates.crt
prabeesh
fonte
1
a melhor resposta, isso funcionou para mim no Linux Mint 17 #
Santiago
No Mac, trabalhou com o seguinte em~/.curlrc cacert=/etc/openssl/cert.pem
amirathi
21

A maneira mais rápida de contornar o erro é adicionar a opção -k em algum lugar da sua solicitação de ondulação. Essa opção "permite conexões com SSL cita sem certs". (de curl --help)

Esteja ciente de que isso pode significar que você não está falando com o terminal que pensa que é, pois eles apresentam um certificado não assinado por uma CA em que você confia.

Por exemplo:

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

me deu a seguinte resposta de erro:

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

Eu adicionei no -k:

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

e nenhuma mensagem de erro. Como um bônus, agora eu tenho o apt-cyg instalado. E certificados CA.

10gistic
fonte
10
Isso pode contornar o erro, mas também torna a conexão "segura" insegura.
Tim
1
Na verdade não. Até onde eu sei, você não pode simplesmente ignorar a criptografia de uma conexão segura, portanto ela ainda é criptografada e vai para apenas um ponto de extremidade. Alguém me corrija se eu estiver errado, mas o único risco que você corre é que pode ser vítima de um ataque do tipo homem do meio. Ainda não é um risco provável se você estiver usando curl.
10gistic
18
Sim, realmente. A opção "-k" é uma abreviação de "--insecure". Se você é homem do meio, o que você acha que ele está fazendo com seus dados? Alerta de spoiler: ele está descriptografando, roubando e possivelmente modificando e injetando de volta no fluxo inseguro. Diretamente da página do manual: "-k, --insecure (SSL) Esta opção permite explicitamente que o curl execute conexões e transferências SSL" inseguras ". Todas as conexões SSL tentam se tornar seguras usando o pacote de certificados da CA instalado por padrão. Isso faz com que todas as conexões consideradas "inseguras" falhem, a menos que -k, --inseguro seja usado. "
Tim
2
Se você precisar de SSL, precisará de privacidade e verificação - a -ksinalização significa que você está perdendo a verificação. Dependendo das suas necessidades, isso pode ser aceitável. O MITM é um ataque não trivial se você assumir que sua rede e o servidor com o qual está se comunicando estão protegidos contra intrusos (você pode fazer isso?). O risco aumenta dependendo do tipo de dados (código fonte e certificados são mais arriscados que as imagens). Você pode verificar a integridade dos dados após a transferência (somas de verificação etc.), mas agora está transferindo sua confiança para esse canal de soma de verificação. No final, -kdá-lhe um pouco mais de trabalho.
Mark Fox
Então, isso significa que se eu estiver usando um certificado autoassinado. Eu deveria estar usando a opção -k. Como talvez não seja possível verificar o certificado autoassinado?
25414 Linus
15

@roens está correto. Isso afeta todos os usuários do Anaconda , com erro abaixo
curl: (77) error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none

A solução alternativa é usar a curvatura padrão do sistema e evitar mexer com a PATHvariável Anaconda anexada . Você também pode

  1. Renomeie o binário de ondulação Anaconda :)
    mv /path/to/anaconda/bin/curl /path/to/anaconda/bin/curl_anaconda

  2. OU remover o Anaconda curl
    conda remove curl

$ which curl /usr/bin/curl

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

Harsha Manjunath
fonte
Boa descoberta, eu não sabia que o Anaconda estava roubando a precedência do meu caminho. Funcionou uma vez que eu substituído curlcom o caminho completo/usr/bin/curl
jxramos
Isso ajudou muito! Obrigado.
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
fonte
7

Para o código PHP em execução no XAMPP no Windows, achei que precisava editar o php.ini para incluir o abaixo

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

copie para um arquivo https://curl.haxx.se/ca/cacert.pem e renomeie para curl-ca-bundle.crt e coloque-o no caminho \ xampp (não consegui fazer o curl.capath funcionar) . Também achei que o CAbundle no site cURL não era suficiente para o site remoto ao qual estava me conectando, então usei um listado com uma versão pré-compilada do Windows do curl 7.47.1 em http://winampplugins.co.uk /ondulação/

LJT
fonte
No Windows, você também pode simplesmente acrescentar "xampp" antes php assim: curl.cainfo = "C: \ xampp \ php \ extras \ cacert.pem"
Ryan Steyn
7

Eu tive o mesmo problema. Acontece que meu /etc/ssl/certs/ca-certificates.crtarquivo estava malformado. A última entrada mostrou algo como isto:

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

Depois de adicionar uma nova linha antes -----END CERTIFICATE-----, o curl conseguiu lidar com o arquivo de certificados.

Foi muito chato descobrir isso, pois meu update-ca-certificatescomando não me deu nenhum aviso.

Isso pode ou não ser um problema de curvatura específico da versão, então aqui está a minha versão, apenas para ser completo:

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 
ShrimpPhaser
fonte
6

Isso funcionou para mim

sudo apt-get install ca-certificates

depois vá para a pasta de certificados em

sudo cd /etc/ssl/certs

copie o arquivo ca-certificates.crt no diretório /etc/pki/tls/certs

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

se não houver pasta tls / certs: crie uma e altere as permissões usando chmod 777 -R folderNAME

Kwame Yeboah
fonte
1
Eu tentei isso, mas isso não funcionou para mim e ainda recebo o mesmo erro. Alguma ideia ?
Anirudh
6

Outra alternativa para corrigir esse problema é desativar a validação do certificado:

echo insecure >> ~/.curlrc
Pablo R. Mier
fonte
1
Solução alternativa, mas isso me ajuda depois de muito tempo com certificados de ondulação. Obrigado.
K. Gol
4

o curl executa a SSLverificação de certificado por padrão, usando um "pacote" de Certificate Authority (CA)chaves públicas (certificados da CA). O pacote padrão é chamado curl-ca-bundle.crt; você pode especificar um arquivo alternativo usando a opção --cacert.

Se este HTTPSservidor usar um certificado assinado por uma CA representada no pacote, a verificação do certificado provavelmente falhou devido a um problema com o certificado (pode estar expirado ou o nome pode não corresponder ao nome de domínio na URL).

Se você deseja desativar a verificação do certificado por curl, use a opção -k (ou --insecure).

por exemplo

curl --insecure http://........
meda
fonte
3
Apenas um aparte de que "confiar na fonte" é bastante irrelevante aqui, já que sem validar adequadamente o certificado em uma CA, você não tem idéia de quem é "a fonte".
Jeff Allen
4

Parece que sua curvatura aponta para um arquivo inexistente com certificados da CA ou similares.

Para a referência principal em certificados de autoridade de certificação com ondulação, consulte: https://curl.haxx.se/docs/sslcerts.html

Daniel Stenberg
fonte
3

Basta criar as pastas que estão faltando no seu sistema.

/ etc / pki / tls / certs /

e crie o arquivo usando o seguinte comando,

sudo apt-get install ca-certificados

e copie e cole o certificado na pasta de destino, que está aparecendo no seu erro. O meu foi " with message 'error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none' in" certifique-se de colar o arquivo no local exato mencionado no erro. Use o seguinte comando para copiar e colar.

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

Fixo.

Manu RS
fonte
Nenhuma das principais respostas funcionou para mim, mas isso funcionou!
Prachiti Prakash Prabhu
2

Pelo que vale a pena, a verificação which curlestá sendo executada também é significativa.

Um usuário em uma máquina compartilhada que eu mantenho estava recebendo esse erro. Mas a causa acabou sendo porque eles instalaram o Anaconda ( http://continuum.io ). Isso colocou o caminho binário do Anaconda antes do padrão $PATH, e ele vem com seu próprio curlbinário, que teve problemas para encontrar os certificados padrão que foram instalados nesta máquina Ubuntu.

roens
fonte
1
Eu recomendo verificar which -a curlpara ver tudo disponível e, claro, anotando qual deles vem por cima.
jxramos
1

Se você estiver usando homebrew no macOS ou linuxbrew no linux, tente reinstalar o openssle curlcom as etapas a seguir nesta página .

Esta mensagem de erro indica que a ondulação não pode estabelecer uma conexão segura usando o openssl. Uma reinstalação do openssl deve corrigir o problema. Para usar temporariamente uma conexão não segura para o curl e o git para baixar os arquivos necessários, execute:

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

Em seguida, instale ou reinstale o openssl e enrole:

HOMEBREW_CURLRC=1 brew reinstall openssl curl

Por fim, desfaça as alterações de segurança para fazer com que o curl e o git usem conexões seguras novamente:

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

Pode ser necessário iniciar uma nova sessão do shell para verificar o resultado com

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

Se mostrar a seguinte saída na saída, o problema deve ser resolvido!

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

Referências:

Itachi
fonte
Depois de horas tentando. Isso me salvou. A solução certa para os macos finalmente. Muito obrigado! :)
mrateb 22/01/19
1

Estou com o mesmo problema: estou criando uma imagem de janela de encaixe baseada em alpinos e, quando quero acessar um site da minha organização, esse erro aparece. Para resolvê-lo, tenho que obter o certificado de CA da minha empresa e, em seguida, preciso adicioná-lo aos certificados de CA da minha imagem.

Obter o certificado da CA

Use o OpenSSL para obter os certificados relacionados ao site:

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

Isso produzirá 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-----
...

Obter o último certificado (o conteúdo entre as -----BEGIN CERTIFICATE-----e as
-----END CERTIFICATE-----marcações incluído) e salve-o em um arquivo (mycompanyRootCA.crt por exemplo)

Crie sua imagem

Então, quando você criar sua imagem do Docker a partir do alpine, faça o seguinte:

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

Sua imagem agora funcionará corretamente! \ o /

alphayax
fonte
1

Se alguém ainda estiver com problemas, tente isso, funcionou para mim. Exclua os arquivos em seu /etc/ssl/certs/diretório e reinstale os certificados ca:

sudo apt install ca-certificates --reinstall

Fiz isso quando tentei instalar o Linuxbrew.

Michael Enitan
fonte
1
Isso me ajudou, mas não excluí os arquivos da minha máquina. Apenas executei o comando simples e o curl começou a funcionar.
Josefhu15
1

Basta encontrar esta solução que funciona perfeitamente para mim.

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

Encontrei esta solução a partir daqui

Daniel
fonte
0

O erro ocorre devido a arquivos de certificado de cadeia SSL corrompidos ou ausentes no diretório PKI. Você precisará verificar se os arquivos estão agrupados, seguindo as etapas: No seu console / terminal:

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

Entre neste site: https://rpmfind.net/linux/rpm2html/search.php?query=ca-certificates , obtenha seu certificado CA para SO. Copie o URL do download e cole no URL: wget your_url_donwload_ca-ceritificated.rpm agora, instale o yout rpm:

rpm2cpio your_url_donwload_ca-ceritificated.rpm | cpio -idmv

agora reinicie o seu serviço: meu exemplo este comando:

sudo service2 httpd restart
Santos L. Victor
fonte
0

Execute o seguinte comando no git bash que funciona bem para mim

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

Isso corrigiu para mim:

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

Abaixo, descreva as etapas para corrigir os problemas.
1. Descubra que o arquivo existe no URL de definição.
2. Caso contrário, baixe o arquivo a partir do URL. https://curl.haxx.se/ca/cacert.pem
3. Copie e envie o arquivo para o caminho definido no arquivo php.ini.
4. Reinicie o serviço apache.

tapas talukder
fonte
0

Eu tive esse problema e minha versão do CURL não pôde analisar certificados codificados em DER (e também não estava prestando atenção à opção --cert-type). Quando converti o certificado para o formato PEM, ele funcionou.

Joshua Davies
fonte
0

No meu caso, o /etc/ssl/certs/ca-certificates.crtarquivo estava ausente. Como se viu, excluí o conteúdo do /etc/ssl/certsDockerfile ao criar a imagem do Docker. Após ajustar meus scripts de shell / comandos bash, executados no Dockerfile - o curl agora funciona perfeitamente dentro do novo contêiner.

Louco por tecnologia
fonte