Vraag Een extern SSL-certificaat weergeven met behulp van CLI-hulpmiddelen


In Chrome wordt door op het groene HTTPS-vergrendelingspictogram te klikken een venster geopend met de certificaatgegevens:

enter image description here

Toen ik hetzelfde probeerde met cURL, kreeg ik slechts een deel van de informatie:

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

Enig idee hoe je de volledige certificaatinformatie kunt krijgen, vorm een ​​command line tool (cURL of andere)?


128
2018-01-23 22:13


oorsprong


Zie ook stackoverflow.com/questions/7885785/... - Vadzim
Waarschijnlijk hangt het ook van de versie af. Mijn huidige curl met vlag --verbose toont de volledige inhoud van het servercertificaat. - Patrick Mevzek


antwoorden:


U zou OpenSSL voor uw doel moeten kunnen gebruiken:

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

Die opdracht maakt verbinding met de gewenste website en pijpt het certificaat in PEM-indeling door naar een andere openssl-opdracht die de details leest en parseert.

(Merk op dat "overbodig" -servername parameter is noodzakelijk om te maken openssl doe een verzoek met SNI-ondersteuning.)


183
2018-01-23 22:26



Er lijkt een fout te zijn met deze opdracht: OpenSSL> openssl:Error: 'CONNECTED(00000003)' is an invalid command. - Adam Matan
@AdamMatan Hebt u de volledige opdracht na de tweede pijp opgenomen? De foutmelding lijkt erop dat de tweede openssl-aanroep uiteindelijk in de interactieve modus (d.w.z. openssl vs openssl x509 -inform pem -noout -text). Wat Pedro schreef, werkt prima voor mij. - Håkan Lindqvist
Merk op dat terwijl s_client de hele keten zal afdrukken, de laatste piped-opdracht alleen informatie over het eerste certificaat zal afdrukken. - chutz
echo op zichzelf is gelijk aan echo '' .. het stuurt een lege string naar stdout. cat /dev/null | zou ook werken en spreekt wat meer voor zichzelf. - hemp
Als je gewoon de vervaldatum, je kunt vervangen -text met -enddate, controleer op andere opties (openssl x509 help). - adriaan


Eenvoudige oplossing

Dat is mijn dagelijkse script:

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

Output:

* 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

42
2018-01-15 13:23



Werkt niet voor mij, bevat niet de begin- / vervaldatums. - Per Lundberg
Sinds een recente wijziging in de krul (ergens tussen de 49 en 52) geeft dit helemaal niets weer over het certificaat. :( - Ross Presser
verwijder de 2> & 1 - Jeshan Babooa
Werkt perfect! Bedankt :-) - Rahul Soni


Afhankelijk van wat voor soort informatie je wilt, maar:

openssl s_client -showcerts -connect gnupg.org:443

zou je het meeste moeten geven, hoewel niet zo goed leesbaar als Chrome het presenteert.


17
2018-01-23 22:20



Helaas wordt door die opdracht zeer weinig van de certificaatgegevens gepresenteerd in een voor mensen leesbaar formaat. - Håkan Lindqvist
Ik ben het niet eens met de vorige opmerking, deze opdracht vertelt me ​​wat ik moet weten en is erg handig. +1 voor antwoord. - camdixon
Als u specifiek wilt testen voor TLS 1.2, kunt u -tls1_2 toevoegen - camdixon


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

De -p 443 geeft aan dat alleen poort 443 moet worden gescand. Alle poorten worden gescand als deze worden weggelaten en de certificaatdetails voor elke SSL-service die wordt gevonden, worden weergegeven. De --script ssl-cert vertelt het Nmap scripting engine om alleen de ssl-cert script. Vanuit het document, dit script "(r) etaleert het SSL-certificaat van een server." De hoeveelheid informatie die over het certificaat wordt afgedrukt, is afhankelijk van het breedsprakigheidsniveau. "

Voorbeelduitvoer:

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

15
2017-11-01 20:37





Om te controleren op SSL-certificaatgegevens, gebruik ik de volgende opdrachtregeltool sinds het beschikbaar is:

https://github.com/azet/tls_tools

Het is geweldig om te controleren of je alle informatie juist hebt voor het opnieuw uitgeven van certificaten of het valideren van bestaande, en ook voor zo weinig afhankelijkheden. EN het vereist geen installatie.

Dit is hoe de eerste paar regels van de uitvoer eruit zien:

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

Die uitvoer wordt gevolgd door de hele certificaatketen op hetzelfde detailniveau.

Wat ik leuk vind, in plaats van een ssl-centrische cli-tool zoals openssl's s_client, probeert deze gewoon het enige werk te doen dat we het meeste nodig hebben. Natuurlijk is openssl flexibeler (d.w.z. ook het controleren van clientcalls, imaps op oneven poorten, enz.) - maar dat heb ik niet altijd nodig.

Als alternatief kun je, als je tijd hebt om te graven en te installeren of meer functies te waarderen, de grotere tool genaamd sslyze (niet gebruiken omdat afhankelijkheden en installatie ...)


5
2018-01-24 01:34





Ik gebruik hiervoor een shellscript. Het is gewoon een wrapper rond de openssl-opdracht die me ervan weerhoudt de syntaxis te onthouden.

Het biedt opties voor het ontleden van de meeste certificaatinformatie waar ik normaal in geïnteresseerd ben, of toon ruwe openssl-uitvoer.

Kan een lokaal certificaatbestand of een externe server opvragen.

Gebruik:

$ 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

U kunt het script hier downloaden: http://giantdorks.org/alain/shell-script-to-check-ssl-certificate-info-like-expiration-date-and-subject/


3
2017-09-08 19:37



De link is dood. - Adam Matan


Als u dit in Windows wilt doen, kunt u PowerShell gebruiken met de volgende functie:

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
}

Hiermee kun je leuke dingen doen zoals

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

3
2017-12-14 16:06





Voor de volledigheid: als u op uw systeem hebt geïnstalleerd Java 7 of hoger

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

toont de keten (zoals geserveerd) met bijna alle details in een meestal nogal lelijk formaat.

Of je moeten heb Java op je systeem geïnstalleerd Ik antwoord niet.


1
2017-09-19 20:27





nmap -sV -sC google.com -p 443

0
2017-07-27 15:58



Dit heeft veel meer uitleg nodig. - Sven♦
eens zijn met de behoefte aan uitleg, maar het werkt voor mij, dus +1 - Jeff


Als u alleen de vervaldatum wilt (wat niet precies het antwoord is maar 9/10 waarop mensen de Chrome cert-gegevens gebruiken), kunt u het volgende gebruiken:

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

Handig voor 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

0
2018-04-06 02:17