446 votes

Affichage des détails d'un certificat SSL distant à l'aide des outils CLI

Dans Chrome, un clic sur l'icône verte du verrou HTTPS ouvre une fenêtre contenant les détails du certificat :

enter image description here

Lorsque j'ai essayé la même chose avec cURL, je n'ai obtenu qu'une partie des informations :

$ 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: */*

Savez-vous comment obtenir les informations complètes du certificat à partir d'un outil en ligne de commande (cURL ou autre) ?

1 votes

3 votes

Cela dépend probablement aussi de la version. Ma version actuelle curl avec drapeau --verbose montre le contenu complet du certificat du serveur.

10voto

Dave Points 453

Si vous voulez faire cela dans Windows, vous pouvez utiliser PowerShell avec la fonction suivante :

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
}

Cela vous permet de faire des choses intéressantes comme

#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*

9voto

MobX Points 913

Si vous ne voulez que la date d'expiration (ce qui n'est pas exactement la réponse, mais c'est à 9/10 que les gens utilisent les détails du certificat Chrome), vous pouvez utiliser :

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

Utile pour les scripts etc.

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

7voto

Florian Heigl Points 1443

Pour vérifier les détails des certificats SSL, j'utilise l'outil en ligne de commande suivant depuis qu'il est disponible :

https://github.com/azet/tls_tools

C'est un excellent moyen de vérifier que toutes les informations sont correctes pour réémettre des certificats ou valider des certificats existants, et aussi de réduire les dépendances. ET il ne nécessite aucune installation.

Voici à quoi ressemblent les premières lignes de la sortie :

$ ./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 

Cette sortie est suivie par l'ensemble de la chaîne de certificats au même niveau de détail.

Ce que j'aime, c'est qu'au lieu d'être un outil cli centré sur le ssl comme le s_client d'openssl, celui-ci essaie de faire juste le travail dont nous avons besoin la plupart du temps. Bien sûr, openssl est plus flexible (c'est-à-dire qu'il vérifie aussi les certificats des clients, les imaps sur des ports bizarres, etc) - mais je n'en ai pas toujours besoin.

Alternativement, si vous avez le temps de creuser et de configurer ou d'apprécier plus de fonctionnalités, il y a le plus gros outil nommé sslyze (je ne l'utilise pas depuis les dépendances et l'installation...).

4voto

Alain Kelder Points 106

J'utilise un Shell Shell pour cela. C'est juste un wrapper autour de la commande openssl qui m'évite de me souvenir de la syntaxe.

Il fournit des options pour analyser la plupart des informations sur les certificats qui m'intéressent, ou pour afficher la sortie brute d'openssl.

Peut soit interroger un fichier de certificat local, soit un serveur distant.

Utilisation :

$ 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

Vous pouvez obtenir le script ici : https://web.archive.org/web/20190528035412/http://giantdorks.org/alain/Shell-Shell-à-vérifier-le-certificat-ssl-comme-expiration-date-et-sujet/

3voto

vladimird Points 1
nmap -sV -sC google.com -p 443

7 votes

Cela nécessite beaucoup plus d'explications.

0 votes

Je suis d'accord avec le besoin d'explication, mais ça marche pour moi, donc +1

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X