Come gestisco i certificati utilizzando cURL mentre provo ad accedere a un URL HTTPS?


188

Ricevo il seguente errore usando l'arricciatura:

curl: (77) errore impostazione certificato verifica posizioni:
  CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: nessuno

Come imposto questo certificato per verificare le posizioni? Grazie.


2
Su quale sistema operativo / distribuzione sei? Dovresti installare il pacchetto ca-certificati (questo è ciò che viene chiamato su debian / ubuntu).
igorw

40
Per riferimento futuro, avevo già ca-certificatesinstallato ma l'errore persisteva. Il problema era che i miei certificati erano situati /etc/ssl/certs/ca-certificates.crtinvece di /etc/pki/tls/certs/ca-bundle.crt, quindi dovevo solo impostare la variabile ambientale CURL_CA_BUNDLEsul percorso corretto.
Robert Smith,

13
Freddo! Funziona per me quando ho impostato export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt.
ordinato il

Risposte:


83

Questo errore è correlato a un pacchetto mancante : ca-certificates. Installalo.

In Ubuntu Linux (e distribuzione simile):

# apt-get install ca-certificates

In CygWin tramite Apt-Cyg

# apt-cyg install ca-certificates

In Arch Linux (Raspberry Pi)

# pacman -S ca-certificates

La documentazione dice:

Questo pacchetto include file PEM di certificati CA per consentire alle applicazioni basate su SSL di verificare l'autenticità delle connessioni SSL.

Come visto su: Debian - Dettagli del pacchetto ca-certificate in squeeze


97
ca-certificate è già la versione più recente, ma sto ancora ricevendo l'errore
Pastor Bones,

2
Ovviamente, otterrai questo stesso errore se provi a installare apt-cyg tramite il metodo raccomandato usando curl e raw.github.com .
10gistic

11
Su Arch Linux, potresti anche averne bisogno pacman -S ca-certificates-utils. L'ho fatto.
Mark Grimes,

8
Questo pacchetto è già installato. Questa risposta non è utile.
JimmyJames,

9
@PastorBones Ho avuto lo stesso problema che il pacchetto era già più recente, penso che fosse stato comunque corrotto, quindi sudo apt install --reinstall ca-certificatesho reinstallato il pacchetto e risolto gli errori che stavo vedendo
Will

153

Avevo anche installato la versione più recente dei certificati ca ma continuavo a ricevere l'errore:

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

Il problema era che l'arricciatura si aspettava che il certificato /etc/pki/tls/certs/ca-bundle.crtsi trovasse sul percorso ma non riusciva a trovarlo perché era sul percorso /etc/ssl/certs/ca-certificates.crt.

Copia il mio certificato nella destinazione prevista eseguendo

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

ha funzionato per me. Sarà necessario creare cartelle per la destinazione di destinazione se non esistono eseguendo

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

Se necessario, modificare il comando sopra per far corrispondere il nome del file di destinazione al percorso previsto /etc/pki/tls/certs/ca-bundle.crtdall'arricciatura , ovvero sostituirlo con il percorso seguente "CAfile:" nel messaggio di errore.


31
Puoi anche creare un link simbolico con ln -sse non vuoi copiarlo ogni volta che lo aggiorni.
starbeamrainbowlabs

4
Ha avuto lo stesso problema con l' rescuetimeapp su Fedora 25. sudo ln -s /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-certificates.crtrisolto il problema. ( CURL_CA_BUNDLEenv var non ha funzionato)
GabLeRoux

Sul mio ubuntu che venga risolta la questione: sudo ln -s /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.pem. In realtà stavo ottenendo ciò The repository ... does not have a Release fileche era causato dalla mancanza del certificato ( Could not load certificates from ...).
Marinos il

84

Metti questo nel tuo .bashrc

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

(vedi commento di Robert)


8
Grazie per aver fornito un metodo che non mi richiede di creare manualmente i file di sistema, ma mantiene comunque la sicurezza dell'uso dei certificati!
Stephen Johnson,

Grazie. Questo ha risolto il mio problema simile con pyenv & curl. Stavo usando Ubuntu 14.04 e avevo già installato i certificati ca.
David,

Questo approccio funziona anche con xonsh (aggiungi $CURL_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt"a .xonshrc).
00:00,

Per ogni evenienza: la versione di una sola CURL_CA_BUNDLE=/path/to/bundle.crt curl http://example.com
riga

30

Crea un file ~/.curlrccon il seguente contenuto

cacert=/etc/ssl/certs/ca-certificates.crt

1
la migliore risposta, questo ha funzionato per me su Linux Mint 17
Santiago,

Su Mac, ha funzionato seguendo~/.curlrc cacert=/etc/openssl/cert.pem
amirathi il

21

Il modo più rapido per aggirare l'errore è aggiungere l'opzione -k da qualche parte nella richiesta di arricciatura. Quell'opzione "consente connessioni a SSL cites senza certificati". (da ricciolo - aiuto)

Tieni presente che ciò può significare che non stai parlando con l'endpoint che ritieni di essere, in quanto presentano un certificato non firmato da una CA di cui ti fidi.

Per esempio:

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

mi ha dato la seguente risposta di errore:

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

Ho aggiunto su -k:

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

e nessun messaggio di errore. Come bonus, ora ho installato apt-cyg. E certificati ca.


10
Ciò potrebbe aggirare l'errore, ma anche rendere la connessione "sicura" diventa insicura.
Tim

1
Non proprio. Per quanto ne so, non puoi semplicemente bypassare la crittografia di una connessione sicura, quindi è ancora crittografata e arriva a un solo endpoint. Qualcuno mi corregga se sbaglio, ma l'unico rischio che corri è che potresti cadere in preda a un attacco man-in-the-middle. Probabilmente non è ancora un rischio se stai usando l'arricciatura.
10gistic

18
Sì davvero. L'opzione "-k" è una scorciatoia per "--insecure". Se hai un uomo in mezzo cosa pensi che stia facendo con i tuoi dati? Avviso spoiler: lo sta decodificando, rubandolo e forse modificandolo e iniettando di nuovo nel flusso insicuro. Direttamente dalla pagina man: "-k, --insecure (SSL) Questa opzione consente esplicitamente all'arricciatura di eseguire connessioni e trasferimenti SSL" non sicuri ". Tutte le connessioni SSL vengono tentate di essere rese sicure utilizzando il pacchetto di certificati CA installato per impostazione predefinita. Ciò rende tutte le connessioni considerate "non sicure" a meno che non venga utilizzato -k, --insecure ".
Tim

2
Se hai bisogno di SSL hai bisogno di privacy e verifica: la -kbandiera indica che stai perdendo la verifica. A seconda delle esigenze, questo può essere accettabile. I MITM sono attacchi non banali se si presume che la propria rete e il server con cui si sta comunicando siano protetti da interlopers (si può fare questo presupposto?). Il rischio aumenta a seconda del tipo di dati dell'utente (codice sorgente e certificati sono più rischiosi delle immagini). Puoi verificare l'integrità dei dati dopo il trasferimento (checksum ecc.) Ma ora stai spostando la tua fiducia su quel canale di checksum. Alla fine -kti dà un po 'più di lavoro.
Mark Fox

Quindi significa che se sto usando un certificato autofirmato. Dovrei usare l'opzione -k. Come potrebbe non essere possibile verificare il certificato autofirmato?
Linus,

15

@roens è corretto. Questo riguarda tutti gli utenti Anaconda , con errore di seguito
curl: (77) error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none

La soluzione alternativa consiste nell'utilizzare l'arricciatura di sistema predefinita ed evitare di fare confusione con la PATHvariabile Anaconda anteposta . Puoi farlo

  1. Rinomina il file binario di curvatura Anaconda :)
    mv /path/to/anaconda/bin/curl /path/to/anaconda/bin/curl_anaconda

  2. OPPURE rimuovere il ricciolo Anaconda
    conda remove curl

$ which curl /usr/bin/curl

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


Buona scoperta, non mi ero reso conto che Anaconda mi stesse rubando la precedenza. Ha funzionato una volta che ho sostituito curlcon il percorso completo/usr/bin/curl
jxramos

Questo ha aiutato molto! Grazie.
Shababb Karim,

12

Da $ 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.

7

Per il codice PHP in esecuzione su XAMPP su Windows ho scoperto che dovevo modificare php.ini per includere quanto segue

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

e poi copia in un file https://curl.haxx.se/ca/cacert.pem e rinomina in curl-ca-bundle.crt e posizionalo sotto il percorso \ xampp (non sono riuscito a far funzionare curl.capath) . Ho anche scoperto che CAbundle sul sito cURL non era abbastanza per il sito remoto a cui mi stavo collegando, quindi ne ho usato uno elencato con una versione pre-compilata di curl 7.47.1 di Windows all'indirizzo http://winampplugins.co.uk /arricciare/


Su Windows puoi anche solo aggiungere "xampp" prima di php in questo modo: curl.cainfo = "C: \ xampp \ php \ extras \ cacert.pem"
Ryan Steyn,

7

Ho avuto lo stesso identico problema. A quanto pare, il mio /etc/ssl/certs/ca-certificates.crtfile non era valido. L'ultima voce ha mostrato qualcosa del genere:

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

Dopo aver aggiunto una nuova riga prima -----END CERTIFICATE-----, curl è stato in grado di gestire il file dei certificati.

Questo è stato molto fastidioso da scoprire poiché il mio update-ca-certificatescomando non mi ha dato alcun avvertimento.

Questo potrebbe essere o non essere un problema specifico della versione di arricciatura, quindi ecco la mia versione, solo per completezza:

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 

6

Questo ha funzionato per me

sudo apt-get install ca-certificates

quindi vai nella cartella dei certificati all'indirizzo

sudo cd /etc/ssl/certs

quindi si copia il file ca-certificati.crt nel file /etc/pki/tls/certs

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

se non esiste una cartella tls / certs: crearne una e cambiare le autorizzazioni usando chmod 777 -R folderNAME


1
Ho provato questo ma questo non ha funzionato per me e ho ancora lo stesso errore. Qualche idea ?
Anirudh,

6

Un'altra alternativa per risolvere questo problema è disabilitare la convalida del certificato:

echo insecure >> ~/.curlrc

1
Soluzione alternativa, ma mi aiuta dopo troppo tempo con i certificati di arricciatura. Grazie.
K. Gol,

4

curl esegue la SSLverifica del certificato per impostazione predefinita, utilizzando un "pacchetto" di Certificate Authority (CA)chiavi pubbliche ( certificati CA). Il bundle predefinito si chiama curl-ca-bundle.crt; puoi specificare un file alternativo usando l'opzione --cacert.

Se questo HTTPSserver utilizza un certificato firmato da una CA rappresentata nel pacchetto, la verifica del certificato probabilmente non è riuscita a causa di un problema con il certificato (potrebbe essere scaduto o il nome potrebbe non corrispondere al nome di dominio nell'URL).

Se desideri disattivare la verifica del ricciolo del certificato, usa l' --insecureopzione -k (o ).

per esempio

curl --insecure http://........

3
A parte il fatto che "fidarsi della fonte" è piuttosto irrilevante qui, dal momento che senza convalidare correttamente il certificato contro una CA, non si ha idea di chi sia "la fonte".
Jeff Allen,


3

Basta creare le cartelle, che mancano nel tuo sistema.

/ Etc / pki / TLS / certs /

e crea il file usando il seguente comando,

sudo apt-get install ca-certificati

e quindi copia e incolla il certificato nella cartella di destinazione, che viene visualizzata nel tuo errore. Il mio era " with message 'error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none' in" assicurati di incollare il file nella posizione esatta menzionata nell'errore. Utilizzare il comando seguente per copiare incolla ..

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

Fisso.


Nessuna delle risposte migliori ha funzionato per me ma questo ha funzionato!
Prachiti Prakash Prabhu,

2

Per quello che vale, anche il controllo which curlin corso è significativo.

Un utente su una macchina condivisa che sostengo aveva riscontrato questo errore. Ma la causa si è rivelata perché avevano installato Anaconda ( http://continuum.io ). In questo modo ha messo percorso binario di Anaconda prima che lo standard $PATH, e viene fornito con un proprio curlbinario, che ha avuto problemi a trovare i certs di default che sono stati installati su questa macchina Ubuntu.


1
Consiglio di controllare which -a curlper vedere tutto ciò che è disponibile e, ovviamente, notare quale si trova in cima.
jxramos,

2

Se qualcuno ha ancora problemi, prova questo, ha funzionato per me. Elimina i file nella tua /etc/ssl/certs/directory quindi reinstalla i certificati ca:

sudo apt install ca-certificates --reinstall

L'ho fatto quando ho provato a installare Linuxbrew.


1
Questo mi ha aiutato ma non ho eliminato i file sul mio computer. Ho appena eseguito il semplice comando e il ricciolo ha iniziato a funzionare.
Josefhu15,

1

Se stai usando homebrew su macOS o linuxbrew in linux, prova a reinstallare openssle curlcon i seguenti passaggi da questa pagina .

Questo messaggio di errore indica che curl non è in grado di stabilire una connessione sicura usando openssl. Una reinstallazione di openssl dovrebbe risolvere il problema. Per utilizzare temporaneamente una connessione non sicura sia per curl che per git per scaricare tutti i file necessari, eseguire:

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

Quindi, installa o reinstalla openssl e arriccia:

HOMEBREW_CURLRC=1 brew reinstall openssl curl

Infine, annulla le modifiche di sicurezza per fare in modo che curl e git utilizzino nuovamente le connessioni sicure:

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

Potrebbe essere necessario avviare una nuova sessione di shell per verificare il risultato con

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

Se mostra il seguente output nell'output, il problema dovrebbe essere risolto!

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

Riferimenti:


Dopo ore di tentativi. Questo mi ha salvato. Finalmente la giusta soluzione per macos. Molte grazie! :)
mrateb

1

Ho lo stesso problema: sto costruendo un'immagine docker con base alpina e quando voglio arricciarmi su un sito Web della mia organizzazione, appare questo errore. Per risolverlo, devo ottenere il certificato CA della mia azienda, quindi devo aggiungerlo ai certificati CA della mia immagine.

Ottieni il certificato CA.

Utilizzare OpenSSL per ottenere i certificati relativi al sito Web:

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

Questo produrrà qualcosa di simile:

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

Ottieni l'ultimo certificato (il contenuto tra il -----BEGIN CERTIFICATE-----e il
-----END CERTIFICATE-----markup incluso) e salvalo in un file (mycompanyRootCA.crt per esempio)

Costruisci la tua immagine

Quindi, quando costruirai l'immagine docker da Alpine, procedi come segue:

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

La tua immagine ora funzionerà correttamente! \ O /


1

Scopri che questa soluzione funziona perfettamente per me.

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

Ho trovato questa soluzione da qui


0

L'errore è dovuto a file di certificati della catena SSL corrotti o mancanti nella directory PKI. Dovrai assicurarti che i file siano raggruppati, seguendo i passaggi seguenti: Nella tua console / terminale:

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

Entra in questo sito: https://rpmfind.net/linux/rpm2html/search.php?query=ca-certificates , ottieni il tuo certificato ca, per SO. Copia l'URL del download e incollalo nell'URL: wget your_url_donwload_ca-ceritificated.rpm ora, installa il tuo rpm:

rpm2cpio your_url_donwload_ca-ceritificated.rpm | cpio -idmv

ora riavvia il tuo servizio: il mio esempio questo comando:

sudo service2 httpd restart

0

Esegui il comando seguente in git bash che funziona bene per me

git config --global http.sslverify "false"

0

Questo risolto per me:

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


0

Di seguito vengono descritti i passaggi per risolvere i problemi.
1. Scopri che il file esiste sull'URL definito.
2. In caso contrario, scaricare il file dall'URL. https://curl.haxx.se/ca/cacert.pem
3. Copiare e analizzare il file nel percorso definito sul file php.ini.
4. Riavvia il servizio apache.


0

Ho avuto questo problema e ho scoperto che la mia versione di CURL non ha potuto analizzare i certificati con codifica DER (e non stava prestando attenzione nemmeno all'opzione --cert-type). Quando ho convertito il certificato in formato PEM ha funzionato.


0

Nel mio caso il /etc/ssl/certs/ca-certificates.crtfile mancava. Come si è scoperto, ho eliminato il contenuto /etc/ssl/certsall'interno del Dockerfile durante la creazione dell'immagine docker. Dopo aver regolato i miei script di shell / comandi bash eseguiti dal Dockerfile - il ricciolo ora funziona perfettamente dal nuovo contenitore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.