سؤال عرض تفاصيل شهادة 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
نظرًا لأن بعض التغييرات الحديثة في curl (ما بين 49 و 52) لا تعرض أي شيء على الإطلاق حول الشهادة. :( - 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 لتشغيل فقط 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 

يتم اتباع هذا الإخراج بواسطة سلسلة الشهادة بأكملها بنفس مستوى التفاصيل.

ما يعجبني بدلاً من أن أكون أداة ssl-centric cli مثل opensysl's s_client ، يحاول هذا الشخص القيام بمهمة واحدة فقط نحتاجها في معظم الأوقات. وبطبيعة الحال ، فإن openssl أكثر مرونة (أي أيضًا التحقق من العملاء المستهدفين ، و imaps على المنافذ الفردية ، الخ) - لكنني لا أحتاج ذلك دائمًا.

بدلاً من ذلك ، إذا كان لديك وقت للحفر والإعداد أو تقدير المزيد من الميزات ، فهناك الأداة الأكبر المسماة sslyze (لا تستخدمها منذ تبعيات وتثبيتها ...)


5
2018-01-24 01:34





أنا استخدم برنامج نصي شل لهذا. انها مجرد التفاف حول الأمر 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*

3
2017-12-14 16:06





nmap -sV -sC google.com -p 443

1
2017-07-27 15:58



هذا يحتاج إلى الكثير من الشرح. - Sven♦
نتفق مع الحاجة إلى الشرح ، لكنه يعمل بالنسبة لي ، لذلك +1 - Jeff


إذا كنت تريد فقط تاريخ انتهاء الصلاحية (والذي لا يمثل الإجابة بالضبط ، ولكنه 9/10 ما يستخدمه الأشخاص من تفاصيل Chrome for) ، فيمكنك استخدام:

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

1
2018-04-06 02:17