Menampilkan detail sertifikat SSL jarak jauh menggunakan alat CLI

187

Di Chrome, mengklik ikon kunci HTTPS hijau membuka jendela dengan detail sertifikat:

masukkan deskripsi gambar di sini

Ketika saya mencoba hal yang sama dengan CURL, saya hanya mendapatkan beberapa informasi:

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

Adakah yang tahu bagaimana mendapatkan informasi sertifikat lengkap dari alat baris perintah (cURL atau lainnya)?

Adam Matan
sumber
Mungkin tergantung pada versi juga. curlBendera saya saat ini --verbosemenunjukkan konten sertifikat server lengkap.
Patrick Mevzek

Jawaban:

263

Anda harus dapat menggunakan OpenSSL untuk tujuan Anda:

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

Perintah itu terhubung ke situs web yang diinginkan dan pipa sertifikat dalam format PEM ke perintah openssl lain yang membaca dan mem-parsing detail.

(Perhatikan bahwa -servernameparameter "redundant" diperlukan untuk opensslmelakukan permintaan dengan dukungan SNI.)

Pedro Perez
sumber
Tampaknya ada kesalahan dengan perintah ini:OpenSSL> openssl:Error: 'CONNECTED(00000003)' is an invalid command.
Adam Matan
2
@AdamMatan Apakah Anda menyertakan perintah lengkap setelah pipa kedua? Pesan kesalahan tampak seperti doa openssl kedua berakhir berjalan dalam mode interaktif (yaitu opensslvs openssl x509 -inform pem -noout -text). Apa yang ditulis Pedro berfungsi baik untuk saya.
Håkan Lindqvist
4
Perhatikan bahwa sementara s_client akan mencetak seluruh rantai, perintah pipa terakhir hanya akan mencetak informasi tentang sertifikat pertama.
chutz
1
echodengan sendirinya sama dengan echo ''.. mengirimkan string kosong ke stdout. cat /dev/null |akan bekerja juga dan sedikit lebih jelas.
rami
2
Jika Anda hanya ingin mengetahui tanggal kedaluwarsa , Anda dapat menggantinya -textdengan -enddate, periksa opsi lain ( openssl x509 help).
adriaan
63

Solusi sederhana

Itu naskah saya sehari-hari:

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

Keluaran:

* 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
Antonio Feitosa
sumber
5
Tidak bekerja untuk saya, tidak termasuk tanggal mulai / kedaluwarsa.
Per Lundberg
4
Karena beberapa perubahan ikal baru-baru ini (di suatu tempat antara 49 dan 52) ini tidak menampilkan apa-apa tentang sertifikat. :(
Ross Presser
hapus 2> & 1
Jeshan Babooa
27

Tergantung pada jenis informasi yang Anda inginkan, tetapi:

openssl s_client -showcerts -connect gnupg.org:443

harus memberi Anda sebagian besar, meskipun tidak sebaik yang dapat dibaca manusia seperti yang disajikan Chrome.

pemalsu
sumber
1
Sayangnya, sangat sedikit data sertifikat yang disajikan dalam format yang dapat dibaca manusia oleh perintah itu.
Håkan Lindqvist
9
Saya tidak setuju dengan komentar sebelumnya, perintah ini memberi tahu saya apa yang perlu saya ketahui dan sangat berguna. +1 untuk jawaban.
camdixon
Jika Anda secara khusus ingin menguji TLS 1.2, Anda dapat menambahkan -tls1_2
camdixon
23
nmap -p 443 --script ssl-cert gnupg.org

Yang -p 443menentukan untuk memindai port 443 saja. Semua port akan dipindai jika dihilangkan, dan detail sertifikat untuk layanan SSL apa pun yang ditemukan akan ditampilkan. The --script ssl-certmenceritakan mesin scripting Nmap untuk menjalankan hanya ssl-certskrip. Dari dokumen ini, skrip ini "(r) menghapus sertifikat SSL server. Jumlah informasi yang dicetak tentang sertifikat tergantung pada tingkat verbositas."

Output sampel:

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
Jose Quinteiro
sumber
6

Untuk memeriksa detail sertifikat SSL, saya menggunakan alat baris perintah berikut sejak tersedia:

https://github.com/azet/tls_tools

Sangat bagus untuk memeriksa kembali apakah Anda memiliki semua informasi yang benar untuk menerbitkan kembali sertifikat atau memvalidasi sertifikat yang ada, dan juga beberapa dependensi DAN tidak memerlukan pengaturan.

Beginilah tampilan beberapa baris pertama dari output:

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

Output itu diikuti oleh seluruh rantai sertifikat pada tingkat detail yang sama.

Apa yang saya suka itu daripada menjadi alat cli ssl-sentris seperti s_client openssl, yang satu ini mencoba untuk hanya melakukan satu pekerjaan yang paling kita butuhkan. Tentu saja openssl lebih fleksibel (mis. Juga memeriksa clientcerts, imaps pada port aneh, dll) - tapi saya tidak selalu membutuhkannya.

Atau, jika Anda punya waktu untuk menggali & mengatur atau menghargai lebih banyak fitur, ada alat yang lebih besar bernama sslyze (tidak menggunakannya karena dependensi dan instal ...)

Florian Heigl
sumber
5

Untuk kelengkapan: jika Anda telah menginstal pada sistem Java 7 atau lebih tinggi

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

menunjukkan rantai (seperti yang disajikan) dengan hampir semua detail dalam format yang sebagian besar agak jelek.

Apakah Anda harus menginstal Java pada sistem Anda, saya tidak menjawab.

dave_thompson_085
sumber
brilian, output default jauh lebih berguna daripada openssl (yang perlu decoding).
simon
4

Saya menggunakan skrip shell untuk ini. Itu hanya pembungkus di sekitar perintah openssl yang menyelamatkan saya dari mengingat sintaks.

Ini memberikan opsi untuk menguraikan sebagian besar informasi sertifikat yang biasanya saya minati, atau menampilkan keluaran openssl mentah.

Dapat meminta file sertifikat lokal, atau server jauh.

Pemakaian:

$ 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

Anda bisa mendapatkan skrip di sini: http://giantdorks.org/alain/shell-script-to-check-ssl-certificate-info-like-expiration-date-and-subject/

Alain Kelder
sumber
Tautannya sudah mati.
Adam Matan
4

Jika Anda ingin melakukan ini di Windows Anda dapat menggunakan PowerShell dengan fungsi berikut:

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
}

Ini memungkinkan Anda untuk melakukan beberapa hal seperti rapi

#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*
Neossian
sumber
2
nmap -sV -sC google.com -p 443
Sergio Rua
sumber
3
Ini membutuhkan lebih banyak penjelasan.
Sven
setuju dengan kebutuhan akan penjelasan, tetapi itu berhasil untuk saya, jadi +1
Jeff
2

Jika Anda hanya menginginkan tanggal kedaluwarsa (yang bukan jawabannya tetapi 9/10 untuk apa orang menggunakan detail sertifikas Chrome), Anda dapat menggunakan:

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

Berguna untuk skrip dll

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
kita sendiri
sumber