Anche se sono d'accordo con la risposta di Ari (e l'ho votata positivamente :), avevo bisogno di fare un ulteriore passaggio per farlo funzionare con Java su Windows (dove doveva essere distribuito):
openssl s_client -showcerts -connect www.example.com:443 < /dev/null | openssl x509 -outform DER > derp.der
Prima di aggiungere il openssl x509 -outform DER
conversione, ricevevo un errore da keytool su Windows che si lamentava del formato del certificato. L'importazione del file .der ha funzionato correttamente.
Si scopre che qui c'è più complessità:avevo bisogno di fornire molti più dettagli per farlo funzionare. Penso che abbia qualcosa a che fare con il fatto che si tratta di una connessione che richiede l'autenticazione del client e l'hankshake aveva bisogno di più informazioni per continuare fino alla fase in cui i certificati sono stati scaricati.
Ecco il mio comando funzionante:
openssl s_client -connect host:port -key our_private_key.pem -showcerts \
-cert our_server-signed_cert.pem
Spero che questa sia una spinta nella giusta direzione per chiunque abbia bisogno di qualche informazione in più.
Un one-liner per estrarre il certificato da un server remoto in formato PEM, questa volta usando sed
:
openssl s_client -connect www.google.com:443 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
Con SNI
Se il server remoto utilizza SNI (ovvero condivide più host SSL su un singolo indirizzo IP) dovrai inviare il nome host corretto per ottenere il certificato corretto.
openssl s_client -showcerts -servername www.example.com -connect www.example.com:443 </dev/null
Senza SNI
Se il server remoto non utilizza SNI, puoi saltare -servername
parametro:
openssl s_client -showcerts -connect www.example.com:443 </dev/null
Per visualizzare tutti i dettagli del certificato di un sito puoi utilizzare anche questa catena di comandi:
$ echo | \
openssl s_client -servername www.example.com -connect www.example.com:443 2>/dev/null | \
openssl x509 -text