È possibile creare un certificato del file server pem dal risultato di openssl s_client -showcerts?

0

So che è possibile elencare i certificati server da un client tramite openssl s_client -showcerts .

Quindi, la mia domanda è, è possibile creare un certificato ssl server valido da questo senza dover contattare l'amministratore del server?

Ho il controllo della mia macchina client ma non del server, quindi se posso evitarlo, farebbe risparmiare problemi. Credo di aver bisogno di un file .pem e ho bisogno di un certificato di root dato che usare curl per accedere ai risultati del server in unable to get local issuer certificate .

Se non fosse possibile farlo, sarebbe gradita un'applicazione gentile del perché non è possibile, dato che sono un po 'fuori dalla mia profondità qui. Mi sembra logico che sia possibile poiché il server ha già fornito il suo certificato.

openssl s_client -showcerts restituisce anche questi errori:

verify error:num=20:unable to get local issuer certificate
verify error:num=27:certificate not trusted
verify error:num=21:unable to verify the first certificate

In sostanza, mi piacerebbe essere in grado di rendere ssl come un cliente affidabile per il server a cui mi sto connettendo.

    
posta user55570 23.01.2016 - 21:29
fonte

1 risposta

1

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.

    
risposta data 24.01.2016 - 07:07
fonte

Leggi altre domande sui tag