שאלה הצגת פרטי אישור 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 או אחר)?


130
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.)


183
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

43
2018-01-15 13:23



לא עובד בשבילי, אינו כולל את תאריכי ההתחלה / התפוגה. - Per Lundberg
מאז שינוי כלשהו לאחרונה סלסול (איפשהו בין 49 ל 52) זה לא מציג שום דבר על האישור. You - Ross Presser
הסר את 2> 1 - Jeshan Babooa
עובד כמו קסם! תודה :-) - Rahul Soni


תלוי איזה סוג של מידע אתה רוצה, אבל:

openssl s_client -showcerts -connect gnupg.org:443

צריך לתת לך ביותר, אם כי לא קריא כמו אדם כמו Chrome מציג את זה.


17
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 scripting מנוע כדי להפעיל רק את 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

15
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 

פלט זה ואחריו את שרשרת האישור כולו באותה רמה של פירוט.

מה שאני אוהב את זה במקום להיות כלי cli ssl centric כמו ssclient של opensl, זה אחד מנסה לעשות רק את העבודה שאנחנו צריכים רוב הזמן. כמובן OpenSsl היא גמישה יותר (כלומר גם בדיקת clientcerts, imaps על יציאות מוזרות, וכו ') - אבל אני לא תמיד צריך את זה.

לחלופין, אם יש לך זמן לחפור ב & ההתקנה או להעריך תכונות נוספות, יש את הכלי הגדול בשם sslyze (לא משתמש בו מאז תלות ולהתקין ...)


5
2018-01-24 01:34





אני משתמש סקריפט פגז על זה. זה רק עטיפה סביב הפקודה openssl זה חוסך לי לזכור את התחביר.

הוא מספק אפשרויות לנתח את רוב מידע האישור אני בדרך כלל מעוניין, או להציג הפלט rawsl גלם.

ניתן לבצע שאילתה בקובץ אישורים מקומי או בשרת מרוחק.

שימוש:

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

3
2017-12-14 16:06





nmap -sV -sC google.com -p 443

1
2017-07-27 15:58



זה צריך הסבר הרבה יותר. - Sven♦
מסכים עם הצורך בהסבר, אבל זה עובד בשבילי, כך +1 - Jeff