Visualizzazione dei dettagli di un certificato SSL remoto utilizzando gli strumenti della CLI


187

In Chrome, facendo clic sull'icona di blocco HTTPS verde si apre una finestra con i dettagli del certificato:

inserisci qui la descrizione dell'immagine

Quando ho provato lo stesso con cURL, ho ricevuto solo alcune delle informazioni:

$ curl -vvI https://gnupg.org
* Rebuilt URL to: https://gnupg.org/
* Hostname was NOT found in DNS cache
*   Trying 217.69.76.60...
* Connected to gnupg.org (217.69.76.60) port 443 (#0)
* TLS 1.2 connection using TLS_DHE_RSA_WITH_AES_128_CBC_SHA
* Server certificate: gnupg.org
* Server certificate: Gandi Standard SSL CA
* Server certificate: UTN-USERFirst-Hardware
> HEAD / HTTP/1.1
> User-Agent: curl/7.37.1
> Host: gnupg.org
> Accept: */*

Qualche idea su come ottenere le informazioni complete sul certificato da uno strumento da riga di comando (cURL o altro)?



Probabilmente dipende anche dalla versione. La mia corrente curlcon flag --verbosemostra l'intero contenuto del certificato del server.
Patrick Mevzek,

Risposte:


263

Dovresti essere in grado di utilizzare OpenSSL per il tuo scopo:

echo | openssl s_client -showcerts -servername gnupg.org -connect gnupg.org:443 2>/dev/null | openssl x509 -inform pem -noout -text

Tale comando si collega al sito Web desiderato e reindirizza il certificato in formato PEM su un altro comando openssl che legge e analizza i dettagli.

(Si noti che il -servernameparametro "ridondante" è necessario per openssleseguire una richiesta con supporto SNI.)


Sembra esserci un errore con questo comando:OpenSSL> openssl:Error: 'CONNECTED(00000003)' is an invalid command.
Adam Matan,

2
@AdamMatan Hai incluso il comando completo dopo la seconda pipe? Il messaggio di errore sembra che il secondo richiamo di openssl sia finito in modalità interattiva (cioè opensslvs openssl x509 -inform pem -noout -text). Ciò che Pedro ha scritto funziona bene per me.
Håkan Lindqvist,

4
Si noti che mentre s_client stamperà l'intera catena, l'ultimo comando piped stamperà solo informazioni sul primo certificato.
Chutz,

1
echoda solo equivale a echo ''... invia una stringa vuota a stdout. cat /dev/null |funzionerebbe anche ed è un po 'più autoesplicativo.
canapa

2
Se desideri conoscere solo la data di scadenza , puoi sostituirla -textcon -enddate, controlla altre opzioni ( openssl x509 help).
adriaan,

63

Soluzione semplice

Questa è la mia sceneggiatura quotidiana:

curl --insecure -v https://www.google.com 2>&1 | awk 'BEGIN { cert=0 } /^\* SSL connection/ { cert=1 } /^\*/ { if (cert) print }'

Produzione:

* SSL connection using TLS1.2 / ECDHE_RSA_AES_128_GCM_SHA256
*    server certificate verification SKIPPED
*    server certificate status verification SKIPPED
*    common name: www.google.com (matched)
*    server certificate expiration date OK
*    server certificate activation date OK
*    certificate public key: RSA
*    certificate version: #3
*    subject: C=US,ST=California,L=Mountain View,O=Google Inc,CN=www.google.com
*    start date: Wed, 24 May 2017 17:39:15 GMT
*    expire date: Wed, 16 Aug 2017 17:13:00 GMT
*    issuer: C=US,O=Google Inc,CN=Google Internet Authority G2
*    compression: NULL
* ALPN, server accepted to use http/1.1
* Connection #0 to host www.google.com left intact

5
Non funziona per me, non include le date di inizio / scadenza.
Per Lundberg,

4
Da qualche recente cambiamento di arricciatura (da qualche parte tra 49 e 52), questo non mostra nulla del certificato. :(
Ross Presser,

rimuovere 2> & 1
Jeshan Babooa l'

27

Dipende dal tipo di informazioni che desideri, ma:

openssl s_client -showcerts -connect gnupg.org:443

dovrebbe darti di più, anche se non così bene leggibile dall'uomo come Chrome lo presenta.


1
Sfortunatamente, molto poco dei dati del certificato è presentato in formato leggibile da quel comando.
Håkan Lindqvist,

9
Non sono d'accordo con il commento precedente, questo comando mi dice cosa devo sapere ed è molto utile. +1 per la risposta.
Camdixon,

Se vuoi testare specificamente TLS 1.2 puoi aggiungere -tls1_2
camdixon

23
nmap -p 443 --script ssl-cert gnupg.org

I -p 443specifica per la scansione porta 443 solo. Tutte le porte verranno scansionate se omesse e verranno visualizzati i dettagli del certificato per qualsiasi servizio SSL trovato. Il --script ssl-certdice al motore di scripting Nmap di eseguire solo lo ssl-certscript. Dal documento, questo script "(r) elimina il certificato SSL di un server. La quantità di informazioni stampate sul certificato dipende dal livello di dettaglio."

Uscita campione:

Starting Nmap 7.40 ( https://nmap.org ) at 2017-11-01 13:35 PDT
Nmap scan report for gnupg.org (217.69.76.60)
Host is up (0.16s latency).
Other addresses for gnupg.org (not scanned): (null)
rDNS record for 217.69.76.60: www.gnupg.org
PORT    STATE SERVICE
443/tcp open  https
| ssl-cert: Subject: commonName=gnupg.org
| Subject Alternative Name: DNS:gnupg.org, DNS:www.gnupg.org
| Issuer: commonName=Gandi Standard SSL CA 2/organizationName=Gandi/stateOrProvinceName=Paris/countryName=FR
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2015-12-21T00:00:00
| Not valid after:  2018-03-19T23:59:59
| MD5:   c3a7 e0ed 388f 87cb ec7f fd3e 71f2 1c3e
|_SHA-1: 5196 ecf5 7aed 139f a511 735b bfb5 7534 df63 41ba

Nmap done: 1 IP address (1 host up) scanned in 2.31 seconds

6

Per verificare i dettagli del certificato SSL, utilizzo il seguente strumento da riga di comando da quando è diventato disponibile:

https://github.com/azet/tls_tools

È ottimo per ricontrollare che tutte le informazioni sono corrette per la riemissione di certificati o per la convalida di quelli esistenti, e anche come poche dipendenze E non richiede alcuna configurazione.

Ecco come appaiono le prime righe dell'output:

$ ./check_certificate_chain.py gnupg.org 443

>> Certificate Chain:

 [+]*       OU=Domain Control Validated, OU=Gandi Standard SSL, CN=gnupg.org
 [+]**      C=FR, O=GANDI SAS, CN=Gandi Standard SSL CA
 [+]***     C=US, ST=UT, L=Salt Lake City, O=The USERTRUST Network, OU=http://www.usertrust.com, CN=UTN-USERFirst-Hardware

>> Certificate Information:

................................................................................
- [Subject]:        OU=Domain Control Validated, OU=Gandi Standard SSL, CN=gnupg.org
- [Issuer]:     C=FR, O=GANDI SAS, CN=Gandi Standard SSL CA
- [Valid from]:     Mar 18 00:00:00 2014 GMT
- [Valid until]:    Mar 18 23:59:59 2016 GMT
- [Authority]:      Is not a CA
- [Version]:        2
- [Serial No.]:     43845251655098616578492338727643475746
- [X.509 Extension Details]:
  -- [x509_authorityKeyIdentifier]:
       keyid:B6:A8:FF:A2:A8:2F:D0:A6:CD:4B:B1:68:F3:E7:50:10:31:A7:79:21 

Tale output è seguito da tutta la catena di certificati con lo stesso livello di dettaglio.

Quello che mi piace, invece di essere uno strumento di cli ssl-centrico come il client di openssl, questo cerca di fare solo il lavoro di cui abbiamo bisogno la maggior parte del tempo. Ovviamente openssl è più flessibile (ovvero controlla anche i client, gli imap su porte dispari, ecc.) - ma non sempre ne ho bisogno.

In alternativa, se hai tempo per scavare e configurare o apprezzare più funzionalità, c'è lo strumento più grande chiamato sslyze (non lo utilizza da dipendenze e installazione ...)


5

Per completezza: se hai installato sul tuo sistema Java 7 o versioni successive

 keytool -printcert -sslserver $host[:$port]

mostra la catena (come servita) con quasi tutti i dettagli in un formato per lo più piuttosto brutto.

Sia che si dovrebbe avere Java installato sul proprio sistema non rispondo.


output predefinito brillante, molto più utile di openssl (che necessita di decodifica).
simon

4

Per questo uso uno script di shell. È solo un wrapper attorno al comando openssl che mi salva dal ricordare la sintassi.

Fornisce opzioni per analizzare la maggior parte delle informazioni sul certificato a cui sono generalmente interessato o per visualizzare l'output raw di openssl.

Può eseguire una query su un file di certificato locale o su un server remoto.

Uso:

$ ssl-cert-info --help
Usage: ssl-cert-info [options]

This shell script is a simple wrapper around the openssl binary. It uses
s_client to get certificate information from remote hosts, or x509 for local
certificate files. It can parse out some of the openssl output or just dump all
of it as text.

Options:

  --all-info   Print all output, including boring things like Modulus and 
               Exponent.

  --alt        Print Subject Alternative Names. These will be typically be 
               additional hostnames that the certificate is valid for.

  --cn         Print commonName from Subject. This is typically the host for 
               which the certificate was issued.

  --debug      Print additional info that might be helpful when debugging this
               script.

  --end        Print certificate expiration date. For additional functionality
               related to certificate expiration, take a look at this script:
               "http://prefetch.net/code/ssl-cert-check".

  --dates      Print start and end dates of when the certificate is valid.

  --file       Use a local certificate file for input.

  --help       Print this help message.

  --host       Fetch the certificate from this remote host.

  --issuer     Print the certificate issuer.

  --most-info  Print almost everything. Skip boring things like Modulus and
               Exponent.

  --option     Pass any openssl option through to openssl to get its raw
               output.

  --port       Use this port when conneting to remote host. If ommitted, port
               defaults to 443.

  --subject    Print the certificate Subject -- typically address and org name.

Examples:

  1. Print a list of all hostnames that the certificate used by amazon.com 
     is valid for.

     ssl-cert-info --host amazon.com --alt
     DNS:uedata.amazon.com
     DNS:amazon.com
     DNS:amzn.com
     DNS:www.amzn.com
     DNS:www.amazon.com

  2. Print issuer of certificate used by smtp.gmail.com. Fetch certficate info
     over port 465.

     ssl-cert-info --host smtp.gmail.com --port 465 --issuer
     issuer= 
         countryName               = US
         organizationName          = Google Inc
         commonName                = Google Internet Authority G2

  3. Print valid dates for the certificate, using a local file as the source of 
     certificate data. Dates are formatted using the date command and display
     time in your local timezone instead of GMT.

     ssl-cert-info --file /path/to/file.crt --dates
     valid from: 2014-02-04 16:00:00 PST
     valid till: 2017-02-04 15:59:59 PST


  4. Print certificate serial number. This script doesn't have a special option
     to parse out the serial number, so will use the generic --option flag to
     pass '-serial' through to openssl.

     ssl-cert-info --host gmail.com --option -serial
     serial=4BF004B4DDC9C2F8

Puoi ottenere lo script qui: http://giantdorks.org/alain/shell-script-to-check-ssl-certificate-info-like-expiration-date-and-subject/


Il link è morto.
Adam Matan,

4

Se vuoi farlo in Windows puoi usare PowerShell con la seguente funzione:

function Retrieve-ServerCertFromSocket ($hostname, $port=443, $SNIHeader, [switch]$FailWithoutTrust)
{
    if (!$SNIHeader) {
        $SNIHeader = $hostname
    }

    $cert = $null
    try {
        $tcpclient = new-object System.Net.Sockets.tcpclient
        $tcpclient.Connect($hostname,$port)

        #Authenticate with SSL
        if (!$FailWithoutTrust) {
            $sslstream = new-object System.Net.Security.SslStream -ArgumentList $tcpclient.GetStream(),$false, {$true}
        } else {
            $sslstream = new-object System.Net.Security.SslStream -ArgumentList $tcpclient.GetStream(),$false
        }

        $sslstream.AuthenticateAsClient($SNIHeader)
        $cert =  [System.Security.Cryptography.X509Certificates.X509Certificate2]($sslstream.remotecertificate)

     } catch {
        throw "Failed to retrieve remote certificate from $hostname`:$port because $_"
     } finally {
        #cleanup
        if ($sslStream) {$sslstream.close()}
        if ($tcpclient) {$tcpclient.close()}        
     }    
    return $cert
}

Questo ti permette di fare cose belle come

#Save to file and open 
Retrieve-ServerCertFromSocket www.wrish.com 443 | Export-Certificate -FilePath C:\temp\test.cer ; start c:\temp\test.cer

#Display the cert details
Retrieve-ServerCertFromSocket www.wrish.com 443 | fl subject,*not*,Thumb*,ser*

2
nmap -sV -sC google.com -p 443

3
Ciò richiede molte più spiegazioni.
Sven

sono d'accordo con la necessità di una spiegazione, ma funziona per me, quindi +1
Jeff

2

Se desideri solo la data di scadenza (che non è esattamente la risposta ma è il 9/10 per cui le persone utilizzano i dettagli del certificato Chrome), puoi utilizzare:

echo | openssl s_client -connect google.com:443 2>/dev/null | openssl x509 -noout -enddate

Utile per script ecc.

c4urself@eos ~ → which ssl_expiry
ssl_expiry () {
  echo | openssl s_client -connect ${1}:443 2> /dev/null | openssl x509 -noout -enddate
}
c4urself@eos ~ → ssl_expiry google.com
notAfter=Jun 12 16:54:00 2018 GMT
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.