come scaricare il certificato SSL da un sito Web?


Risposte:


246

Per scaricare il certificato, è necessario utilizzare il client integrato in openssl in questo modo:

echo -n | openssl s_client -connect HOST:PORTNUMBER \
    | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/$SERVERNAME.cert

Ciò salverà il certificato in /tmp/$SERVERNAME.cert.

È possibile utilizzare -showcertsse si desidera scaricare tutti i certificati nella catena. Ma se vuoi solo scaricare il certificato del server, non è necessario specificare-showcerts

echo -n fornisce una risposta al server, in modo che la connessione venga rilasciata

sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'rimuove le informazioni sulla catena di certificati e i dettagli di connessione. Questo è il formato preferito per importare il certificato in altri keystore.


9
apprezzo che non solo hai dato una buona risposta, ma anche una spiegazione precisa.
marzo

Non -showcertsmostrare il CERT del server / foglia troppo? Ho pensato che visualizzava i prodotti intermedi solo quando quel commutatore era incluso.
Mike B,

Come ha detto la risposta, s_clientmostra sempre il server cert (se ce n'è uno, ovvero il server risponde a ciao e non sceglie una suite anonima). -showcertsmostra tutti i certificati ricevuti, prima il server cert poi gli intermedi e / o il root.
dave_thompson_085,

4
tuttavia, ciò non funziona nelle presenze di un proxy.
Federico Nord,

2
Questo non funziona anche con i server che utilizzano SNI (più certificati / domini su un singolo indirizzo IP). Per evitare problemi, specifica il parametro servername di openssl: openssl s_client -connect HOST: PORTNUMBER -servername CN
verhage

60

Ho trovato la risposta Openssl lo fornisce.

openssl s_client -connect $ {REMHOST}: $ {REMPORT}


2
anche openssl x509 -text <<EOF cert-text EOFper vedere i dettagli del certificato
mpapis

2
sudo rm -f cert.pem && sudo echo -n | openssl s_client -connect localhost:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./cert.pemper gentile concessione di serverfault.com/questions/139728/…
pulkitsinghal

questo compie la stessa e salta l' sedhack.
phs

Questo controlla solo un certificato, e se il servizio fa parte di un gruppo di server con bilanciamento del carico, di cui ognuno ha un certificato diverso, eventualmente firmato da una CA principale diversa? O in altre parole, un attacco mitm potrebbe consentire a questa richiesta di passare al sito reale e quindi indirizzare altre richieste ai suoi server. Ci sono modi per verificarlo? E per ottenere un elenco di tutti i certificati di un dominio?
Jens Timmerman,

@JensTimmerman "O in altre parole, un attacco mitm potrebbe far passare questa richiesta al sito reale e quindi indirizzare altre richieste ai suoi server." Ciò non è possibile a meno che il man-in-the-middle non abbia un certificato valido per il server di destinazione (o se il client è stupido non controlla il certificato del server). Evidentemente, se il server a volte offre un certificato diverso, puoi solo sperare di riuscire a ottenerli tutti ripetendo i tentativi di connessione.
David Tonhofer,

22

Lo strumento client GNUTLSgnutls-cli , inoltre, può semplificare:

gnutls-cli --print-cert www.example.com \
        < /dev/null \
        > www.example.com.certs

Il programma è progettato per fornire un client interattivo al sito, quindi è necessario dargli un input vuoto (in questo esempio, da /dev/null) per terminare la sessione interattiva.


1
come farebbe in modo che gnutls si connetta attraverso il proxy https (configurato a livello di sistema) e stampi il certificato che viene esportato?
Federico Nord,

9

basato sulla risposta di @bignose, ecco una versione autonoma che si adatta bene ad esempio a una ricetta da chef:

sudo apt-get install gnutls-bin 
gnutls-cli --print-cert myserver.com </dev/null| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > myserver.crt
sudo cp myserver.crt /usr/local/share/ca-certificates/myserver.crt
sudo update-ca-certificates

6
true | openssl s_client -connect google.com:443 2>/dev/null | openssl x509

questa modalità di openssl prevede stdin, quindi lo forniamo tramite true |, questo si collega al server specificato nel parametro -connect. 2>/dev/nullelimina gli errori (facoltativo), possiamo passare l'intero output nel parser x509, specificando /dev/stdindi usare la shell pipe come file di input. E che l'uscita sarà solo la -----BEGIN CERTIFICATE-----alla -----END CERTIFICATE-----porzione di s_clientuscita. Puoi reindirizzarlo a un file aggiungendolo > google.com.pemalla fine del comando.


Come meglio posso dire, questo non verifica la catena di certificati, ma può solo dirti quale identità SSL fornisce il server finale.


2
(1) questo non migliora davvero le risposte di 6 anni fa (2) x509legge stdin di default, quindi -in /dev/stdinè ridondante (3) s_clientverifica che il cert del server si colleghi correttamente a un ancoraggio di fiducia locale (root) e non sia scaduto, ma hai ha soppresso le informazioni che mostrerebbero questo (4) NON controlla la revoca (5) controlla il nome nel certificato del server solo in 1.0.2 e quindi non per impostazione predefinita (ma puoi verificarlo facilmente guardando il certificato in seguito)
dave_thompson_085 l'

@ dave_thompson_085, la domanda è come scaricare il certificato, ma non mostrare le informazioni sulla catena. Mi piace openssl x509 molto meglio di sed in un'altra risposta.
Der_Meister,

0

Sintassi alternativa usando Ex e sostituzione del processo:

ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt
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.