Відображення даних про віддалений сертифікат SSL за допомогою інструментів CLI


187

У Chrome, натиснувши зелений значок блокування HTTPS, відкриється вікно з реквізитами сертифікату:

введіть тут опис зображення

Коли я спробував те саме з CURL, я отримав лише частину інформації:

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

Будь-яка ідея, як отримати повну інформацію про сертифікат з інструменту командного рядка (cURL чи інший)?



Напевно, залежить і від версії. Мій поточний curlз прапором --verboseпоказує повний вміст сертифіката сервера.
Патрік Мевзек

Відповіді:


263

Ви повинні мати можливість використовувати OpenSSL для своїх цілей:

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

Ця команда підключається до потрібного веб-сайту та передає сертифікат у форматі PEM на іншу команду openssl, яка читає та аналізує деталі.

(Зверніть увагу, що для надсилання запиту з підтримкою SNI -servernameнеобхідний параметр "резервний" openssl.)


Здається, є помилка з цією командою:OpenSSL> openssl:Error: 'CONNECTED(00000003)' is an invalid command.
Адам Матан

2
@AdamMatan Ви включили повну команду після другої труби? Повідомлення про помилку виглядає так, що другий виклик opensl закінчився в інтерактивному режимі (тобто opensslпроти openssl x509 -inform pem -noout -text). Те, що написав Педро, для мене чудово працює.
Хокан Ліндквіст

4
Зауважте, що поки s_client буде друкувати весь ланцюг, остання команда, що передається, буде друкувати лише інформацію про перший сертифікат.
chutz

1
echoсам по собі еквівалентний echo ''.. він надсилає порожній рядок до stdout. cat /dev/null |працював би і трохи більше пояснює себе.
конопля

2
Якщо ви хочете , щоб просто знати дату закінчення терміну , ви можете замінити -textз -enddate, перевірте інші варіанти ( openssl x509 help).
Адріан

63

Просте рішення

Ось мій щоденний сценарій:

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

Вихід:

* 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
Не працює для мене, не включає дати початку / терміну дії.
Пер Лундберг

4
Оскільки деякі останні зміни в curl (десь між 49 і 52), це взагалі нічого не відображає про сертифікат. :(
Росс Пресер

видаліть 2> & 1
Jeshan Babooa

27

Залежить від потрібної інформації, але:

openssl s_client -showcerts -connect gnupg.org:443

має дати вам найбільше, хоча і не настільки добре читається, як представлений Chrome.


1
На жаль, дуже мало даних сертифікату представлено в читаному людиною форматі цією командою.
Хокан Ліндквіст

9
Я не згоден з попереднім коментарем, ця команда підказує мені те, що мені потрібно знати, і це дуже корисно. +1 для відповіді.
camdixon

Якщо ви спеціально хочете протестувати TLS 1.2, ви можете додати -tls1_2
camdixon

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

В -p 443вказує відсканувати тільки порт 443. Усі порти будуть відскановані, якщо вони опущені, і відобразяться дані про сертифікат для будь-якої служби SSL, яка знайдена. --script ssl-certКаже скриптова движок Nmap для запуску тільки ssl-certсценарій. З документа, цей скрипт "(r) завіряє SSL-сервер сервера. Кількість інформації, надрукованої про сертифікат, залежить від рівня деталізації".

Вибірка зразка:

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

Щоб перевірити наявність деталей сертифіката SSL, я використовую такий інструмент командного рядка з моменту його появи:

https://github.com/azet/tls_tools

Чудово повторно перевірити, чи є у вас вся інформація правильна для повторної видачі сертифікатів або перевірки існуючих, а також як мало залежностей І це не вимагає налаштування.

Ось так виглядають перші кілька рядків виводу:

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

За цим результатом йде весь ланцюжок сертифікатів з однаковим рівнем деталізації.

Що мені подобається, замість того, щоб бути інструментом клі-орієнтованого на ssl, як s_client openssl, цей намагається просто виконати ту роботу, яка нам потрібна більшу частину часу. Звичайно, openssl є більш гнучким (тобто перевірка клієнтських діаграм, зображень на непарних портах тощо) - але мені це не завжди потрібно.

Крім того, якщо у вас є час викопати & налаштувати або оцінити більше функцій, є більший інструмент під назвою sslyze (не використовуючи його з-за залежностей та встановлення ...)


5

Для повноти: якщо ви встановили у вашій системі Java 7 або новішу версію

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

показує ланцюжок (подається) з майже всіма деталями у переважно некрасивому форматі.

Чи повинна у вас встановлена ​​Java у вашій системі, я не відповідаю.


блискучий, набагато корисніший вихід за замовчуванням, ніж openssl (який потребує декодування).
симон

4

Я використовую для цього сценарій оболонки. Це просто обгортка навколо команди openssl, яка рятує мене від запам'ятовування синтаксису.

Він надає варіанти для розбору більшості інформації сертифіката, яка мене зазвичай цікавить, або відображення необробленого результату opensl.

Можна запитувати локальний файл сертифіката або віддалений сервер.

Використання:

$ 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

Ви можете отримати скрипт тут: http://giantdorks.org/alain/shell-script-to-check-ssl-certificate-info-like-expiration-date-and-subject/


Посилання мертва.
Адам Матан

4

Якщо ви хочете зробити це в Windows, ви можете використовувати PowerShell із наступною функцією:

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
}

Це дозволяє робити такі акуратні речі, як

#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
Для цього потрібно набагато більше пояснень.
Свен

погоджуюся з необхідністю пояснення, але це для мене працює, тому +1
Джефф

2

Якщо ви хочете лише термін придатності (який не є точно відповіддю, але це 9/10, що люди використовують для деталей Cert Chrome), ви можете використовувати:

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

Корисно для сценаріїв тощо.

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.