SE il tuo curl
è stato creato per utilizzare OpenSSL - come hai taggato ma non è l'unica opzione per curl
, verifica con curl -V
- AND il server sta servendo correttamente qualsiasi / tutti i cert intermedi, THEN per fidarsi del server curl-with-openssl ha bisogno di un 'truststore' locale contenente il cert root per la catena di certificati del server (NON quella del server stesso) in formato PEM. (Alcuni altri impianti SSL / TLS accettano ancoraggi non-root, ma le versioni precedenti di OpenSSL non possono farlo affatto, e anche 1.0.2 non lo fa per impostazione predefinita.)
METODO 0: forse già lì. I pacchetti di arricciatura spesso includono un "pacchetto" di root CA ampiamente affidabili come Symantec GoDaddy ecc. o link a un altro pacchetto che fa (di solito chiamato qualcosa come ca-bundle o trusted-cas). Il (i) formato (i) dei certificati in tale bundle dipende dalla / e libreria / e SSL / TLS che usi; controlla curl -V
come sopra. Verifica se hai installato un pacchetto di questo tipo e, in tal caso, se il tuo curl
lo sta utilizzando. Se non hai o non puoi ottenere un pacchetto (incluso il caso in cui costruisci le arricciature) E usa OpenSSL, arricciare a monte ha un pacchetto di radici CA estratto da Mozilla NSS / Firefox estratto nel formato PEM concatenato necessario per OpenSSL (e uno strumento per farlo da solo).
openssl
commandline non ha bisogno di usare lo stesso / i truststore predefinito / i come curl
- e anche se lo fa, fino a quando versioni recenti il comando s_client
ha un bug che non usa il truststore predefinito correttamente. Se hai un bundle PEM concatenato, specificalo a s_client
con -CAfile bundlefile
e vedi se questo fa la differenza.
Se il metodo 0 non si applica, è necessario ottenere la root del server e aggiungerlo al truststore, o semplicemente usarlo come truststore da solo.
METHOD 1: get from browser. SE puoi connetterti al server con un browswer come IE / Edge, Firefox, Chrome, ecc. (questo richiede che ci sia un URL che puoi inserire il server risponderà con una pagina web di successo), quindi fare doppio clic sul lucchetto e fare clic su qualsiasi pulsante o collegamento per visualizzare il certificato catena (quelli esatti variano per browser). Seleziona il certificato più in alto nella catena e cerca un'opzione per esportarlo, preferibilmente in formato PEM single-cert (anche in questo caso il metodo esatto varia a seconda del browser). Se non riesci a ottenere il formato PEM single-cert, commenta quale formato hai ottenuto (dai la prima riga se sembra -----BEGIN something
) e ti dirò come convertirlo.
Prendi questo file (copia nella macchina curl
se lo hai creato da qualche altra parte) e aggiungilo al tuo truststore (dipende dal tuo sistema di pacchettizzazione; può essere semplice come concatenarlo al file PEM concatenato esistente) oppure specificalo da solo a curl
con l'opzione --cacert filename
.
METODO 2: s_client plus. Esegui openssl s_client -connect host:port -showcerts
e cattura (reindirizza o raschia) l'output. Prendi il ultimo blocco di righe -----BEGIN CERTIFICATE-----
a ----END CERTIFICATE-----
e inseriscilo in un file, ad esempio topcert
. Se i nomi di s:
e i:
(soggetto ed emittente) che precedono immediatamente questo blocco sono esattamente uguali, questo è il cert della radice e tutto è pronto. Usa questo file come sopra, ma solo se sei soddisfatto questa CA è onesta e competente (anche se apparentemente non ha convinto i creatori del browser se il metodo 1 non ha funzionato) perché stai mettendo la sicurezza dei tuoi dati nelle loro mani .
Se il certificato superiore dal server non è una radice, è necessario ottenere il suo genitore cert, che deve essere la radice. In alternativa, in alcuni casi questo è un certificato "ponte" o "transizione" che collega una nuova CA a un'altra CA (più vecchia) e c'è anche un certificato fratello per la nuova CA che è un CERT radice. Prima fai openssl x509 -in topcert -noout -text
e guarda sotto x509v3 extensions
poi Authority Information Access
per CA Issuers
. Se presente, l'accesso a questo URL (oa uno qualsiasi di essi) dovrebbe fornire il certificato padre. Questo di solito è in formato DER; in tal caso, converti con openssl x509 -in input -inform der -out output
.
Altrimenti, guarda qualsiasi (i) indirizzo (i) OCSP, qualsiasi (i) Punto (i) di Distribuzione CRL e qualsiasi URL (s) o nome (i) di dominio in Criteri di Certificazione o il nome Emittente per i nomi di dominio usati da la CA e colpire lì per cercare di trovare la radice genitore. Analogamente, guarda gli URL oi nomi dei domini nei criteri o nel nome del soggetto e fai un giro per una radice di pari livello. O google per il nome dell'emittente e / o il nome del soggetto. O pubblica qui il certificato. O qualche combinazione.