CLI araçlarını kullanarak uzak SSL sertifika ayrıntılarını görüntüleme


187

Chrome'da yeşil HTTPS kilit simgesine tıkladığınızda sertifika ayrıntılarını içeren bir pencere açılır:

görüntü tanımını buraya girin

CURL ile aynı şeyi denediğimde, bilginin yalnızca bir kısmını aldım:

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

Sertifika bilgisinin tamamını komut satırı aracı (cURL veya diğer) oluşturmak için bir fikrin var mı?



Muhtemelen versiyonuna da bağlı. curlBayrağım ile mevcut benim --verbosetam sunucu sertifikası içeriğini gösterir.
Patrick Mevzek

Yanıtlar:


263

OpenSSL'yi amacınız için kullanabilmeniz gerekir:

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

Bu komut istenen web sitesine bağlanır ve sertifikayı PEM biçiminde, ayrıntıları okuyan ve ayrıştıran bir openssl komutuna yönlendirir.

( SNI desteğiyle bir istek -servernameyapmak için "artık" parametresinin gerekli olduğunu unutmayın openssl.)


Bu komutta bir hata var gibi görünüyor:OpenSSL> openssl:Error: 'CONNECTED(00000003)' is an invalid command.
Adam Matan

2
@AdamMatan İkinci borudan sonra tam komutu eklediniz mi? Hata mesajı, ikinci Openssl çağırma (yani etkileşimli modda çalışan sona erdi gibi görünüyor opensslvs openssl x509 -inform pem -noout -text). Pedro'nun yazdıkları benim için iyi çalışıyor.
Håkan Lindqvist,

4
S_client tüm zinciri basarken, son piped komutunun yalnızca ilk sertifika hakkındaki bilgileri yazacağını unutmayın.
Chutz

1
echotek başına eşittir echo ''.. stdout'a boş bir dize gönderir. cat /dev/null |Ayrıca çalışır ve biraz daha açıklayıcıdır.
kenevir

2
Sadece bilmek istiyorsanız son kullanma tarihi , sen yerine -textsahip -enddate, diğer seçenekler için kontrol edin ( openssl x509 help).
adriaan

63

Basit çözüm

Bu benim günlük senaryom:

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

Çıktı:

* 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
İşe yaramıyor, başlangıç ​​/ bitiş tarihlerini içermiyor.
Lundberg Per

4
Son zamanlarda bazı kıvrımlar değiştiğinden (49 ile 52 arasında) bu sertifika ile ilgili hiçbir şey göstermez. :(
Ross Presser

2> & 1
Jeshan Babooa

27

Ne tür bir bilgi istediğinize bağlı, ancak:

openssl s_client -showcerts -connect gnupg.org:443

Chrome'un sunduğu kadar iyi okunabilir olmasa da, size en çok vermeli.


1
Ne yazık ki, sertifika verilerinin çok az bir kısmı bu komutla insan tarafından okunabilir biçimde sunulur.
Håkan Lindqvist,

9
Önceki yoruma katılmıyorum, bu komut bana bilmem gerekenleri anlatıyor ve çok faydalı. Cevap için + 1.
camdixon

Özellikle TLS 1.2 için test etmek istiyorsanız, -tls1_2
camdixon

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

-p 443Belirtir portunu 443 sadece taramak için. Belirtilmezse, tüm bağlantı noktaları taranır ve bulunan herhangi bir SSL hizmetinin sertifika bilgileri görüntülenir. --script ssl-certSöyler Nmap betik motoru sadece çalıştırmak için ssl-certkomut dosyası. Belgeden, bu komut dosyası "(r) bir sunucunun SSL sertifikasını alır. Sertifika hakkında basılan bilgi miktarı ayrıntı düzeyine bağlıdır."

Örnek çıktı:

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 sertifikası ayrıntılarını kontrol etmek için, kullanılabilir olduklarından beri aşağıdaki komut satırı aracını kullanıyorum:

https://github.com/azet/tls_tools

Bu Sizin certs yeniden düzenleyen veya mevcut olanları doğrulayarak, hem de olabildiğince az bağımlılıkları için doğru tüm bilgilere sahip kez daha kontrol harika VE hiçbir kurulum gerektirir.

Çıktının ilk birkaç satırına benzer:

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

Bu çıktıyı, tüm sertifika zincirinde aynı ayrıntı düzeyinde izler.

Bundan hoşlanmam, openssl's s_client gibi bir ssl merkezli cli aracı olmak yerine, bu sadece çoğu zaman ihtiyacımız olan bir işi yapmaya çalışıyor. Tabii openssl daha esnektir (yani müşterileri kontrol etmek, tek portlarda impalar vb.) - ama buna her zaman ihtiyacım yok.

Alternatif olarak, kazmak ve kurmak veya daha fazla özellik takdir etmek için zamanınız varsa, sslyze adlı daha büyük bir araç var (bağımlılıklar ve kurulumdan beri kullanmamak ...)


5

Bütünlüğü sağlamak için: sisteminize Java 7 veya daha yeni bir sürüm yüklediyseniz

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

gösterir zinciri çoğunlukla oldukça çirkin bir biçimde hemen hemen tüm detayları ile (sunulan gibi).

Eğer İster gerektiğini Java sisteminizde yüklü olan ben cevap yok.


openssl'den (kod çözme gerektiren) daha parlak, çok daha kullanışlı varsayılan çıktı.
Simon

4

Bunun için bir kabuk betiği kullanıyorum. Bu sadece openssl komutunun etrafındaki bir sarmalayıcıdır ve beni sözdizimini hatırlamamdan kurtarır.

Genellikle ilgilendiğim sertifika bilgilerinin çoğunu ayrıştırmak veya raw openssl çıktısını görüntülemek için seçenekler sunar.

Yerel bir sertifika dosyasını veya uzak bir sunucuyu sorgulayabilir.

Kullanımı:

$ 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

Senaryoyu buradan alabilirsiniz: http://giantdorks.org/alain/shell-script-to-check-ssl-certificate-info-like-expiration-date-and-subject/


Bağlantı öldü.
Adam Matan

4

Bunu Windows'ta yapmak istiyorsanız, PowerShell'i aşağıdaki işlevle kullanabilirsiniz:

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
}

Bu gibi bazı temiz şeyler yapmanızı sağlar

#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
Bunun çok daha fazla açıklaması gerekiyor.
Sven

açıklama gereği ile aynı fikirdeyim, fakat benim için işe yarıyor, yani +1
Jeff

2

Yalnızca son kullanma tarihini istiyorsanız (bu tam olarak cevap değildir ancak 9, Chrome sertifika ayrıntılarını kullananlar için), şunları kullanabilirsiniz:

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

Scriptler vb. İçin kullanışlıdır.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.