Вопрос: Отображение данных удаленного SSL-сертификата с использованием инструментов CLI


В Chrome, нажав зеленую иконку блокировки HTTPS, открывается окно с информацией о сертификате:

enter image description here

Когда я попробовал то же самое с 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 или другой)?


114
2018-01-23 22:13


Источник


Смотрите также stackoverflow.com/questions/7885785/... - Vadzim
Вероятно, это зависит и от версии. Мой нынешний curl с флагом --verbose показывает полное содержимое сертификата сервера. - Patrick Mevzek


Ответы:


Вы должны иметь возможность использовать OpenSSL для своей цели:

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

Эта команда подключается к желаемому веб-сайту и передает сертификат в формате PEM на другую команду openssl, которая считывает и анализирует детали.

(Обратите внимание, что "избыточный" -servername параметр необходимо сделать openssl выполните запрос с поддержкой SNI.)


167
2018-01-23 22:26



Кажется, что с этой командой возникла ошибка: OpenSSL> openssl:Error: 'CONNECTED(00000003)' is an invalid command. - Adam Matan
@AdamMatan Вы включили полную команду после второго канала? Сообщение об ошибке выглядит так: второй вызов openssl закончился в интерактивном режиме (т. Е. openssl против openssl x509 -inform pem -noout -text). То, что написал Педро, отлично работает для меня. - Håkan Lindqvist
Обратите внимание, что в то время как s_client будет печатать целую цепочку, последняя команда с конвейером будет печатать только информацию о первом сертификате. - chutz
echo само по себе эквивалентно echo '' .. он отправляет пустую строку в stdout. cat /dev/null | также будет работать и немного более понятно. - hemp
Если вы хотите просто знать срок годности, вы можете заменить -text с -enddate, проверьте другие параметры (openssl x509 help). - adriaan


Это мой повседневный сценарий:

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

38
2018-01-15 13:23



Не работает для меня, не включает даты начала и окончания. - Per Lundberg
Поскольку некоторые недавние изменения в curl (где-то между 49 и 52), это ничего не показывает ничего о сертификате. :( - Ross Presser
удалите 2> & 1 - Jeshan Babooa


Зависит от того, какую информацию вы хотите, но:

openssl s_client -showcerts -connect gnupg.org:443

должен дать вам больше всего, хотя и не настолько хорошо читаемый, как Chrome.


14
2018-01-23 22:20



К сожалению, очень небольшая часть данных сертификата представлена ​​в удобочитаемом формате этой командой. - Håkan Lindqvist
Я не согласен с предыдущим комментарием, эта команда подсказывает мне, что мне нужно знать и очень полезно. +1 для ответа. - camdixon
Если вы специально хотите протестировать TLS 1.2, вы можете добавить -tls1_2 - camdixon


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

-p 443 указывает только на сканирование порта 443. Все порты будут отсканированы, если они опущены, и будут отображены данные сертификата для любой найденной службы SSL. --script ssl-cert сообщает Nmap скриптовый движок для запуска только ssl-cert скрипт. Из документа этот сценарий «(r) etrieves 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

12
2017-11-01 20:37





Чтобы проверить данные сертификата 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 более гибкий (т. Е. Также проверяет clientcerts, imaps на нечетных портах и ​​т. Д.), Но мне это не всегда нужно.

В качестве альтернативы, если у вас есть время, чтобы копать и настраивать или ценить больше функций, есть большой инструмент с именем sslyze (не используя его с зависимостями и установкой ...)


5
2018-01-24 01:34





Для этого я использую сценарий оболочки. Это всего лишь оболочка команды openssl, которая избавляет меня от запоминания синтаксиса.

Он предоставляет параметры для обработки большей части информации о сертификатах, которой я обычно интересуюсь, или отображения исходного вывода openssl.

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

Применение:

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


3
2017-09-08 19:37



Ссылка мертва. - Adam Matan


Если вы хотите сделать это в 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
2017-12-14 16:06