Hiển thị chi tiết chứng chỉ SSL từ xa bằng các công cụ CLI


187

Trong Chrome, nhấp vào biểu tượng khóa HTTPS màu xanh lá cây sẽ mở ra một cửa sổ với các chi tiết chứng chỉ:

nhập mô tả hình ảnh ở đây

Khi tôi thử tương tự với cURL, tôi chỉ nhận được một số thông tin:

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

Bất kỳ ý tưởng làm thế nào để có được thông tin chứng chỉ đầy đủ tạo thành một công cụ dòng lệnh (cURL hoặc khác)?



Có lẽ phụ thuộc vào phiên bản quá. Hiện tại của tôi curlvới cờ --verbosehiển thị nội dung chứng chỉ máy chủ đầy đủ.
Patrick Mevzek

Câu trả lời:


263

Bạn sẽ có thể sử dụng OpenSSL cho mục đích của mình:

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

Lệnh đó kết nối với trang web mong muốn và chuyển chứng chỉ theo định dạng PEM sang một lệnh openssl khác để đọc và phân tích chi tiết.

(Lưu ý rằng -servernametham số "dự phòng" là cần thiết để thực opensslhiện yêu cầu với hỗ trợ SNI.)


Dường như có lỗi với lệnh này:OpenSSL> openssl:Error: 'CONNECTED(00000003)' is an invalid command.
Adam Matan

2
@AdamMatan Bạn đã bao gồm toàn bộ lệnh sau ống thứ hai? Thông báo lỗi trông giống như lời gọi openssl thứ hai cuối cùng đã chạy trong chế độ tương tác (tức là opensslvs openssl x509 -inform pem -noout -text). Những gì Pedro viết hoạt động tốt cho tôi.
Håkan Lindqvist

4
Lưu ý rằng trong khi s_client sẽ in toàn bộ chuỗi, lệnh đường ống cuối cùng sẽ chỉ in thông tin về chứng chỉ đầu tiên.
chutz

1
echobởi chính nó tương đương với echo ''.. nó gửi một chuỗi rỗng đến thiết bị xuất chuẩn. cat /dev/null |cũng sẽ làm việc và là một chút tự giải thích.
cây gai dầu

2
Nếu bạn muốn biết ngày hết hạn , bạn có thể thay thế -textbằng -enddate, kiểm tra các tùy chọn khác ( openssl x509 help).
adriaan

63

Giải pháp đơn giản

Đó là kịch bản hàng ngày của tôi:

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

Đầu ra:

* 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
Không làm việc cho tôi, không bao gồm ngày bắt đầu / ngày hết hạn.
Per Lundberg

4
Vì một số thay đổi gần đây về độ cong (ở đâu đó giữa 49 và 52), điều này không hiển thị bất cứ điều gì về chứng chỉ. :(
Ross Presser

xóa 2> & 1
Jeshan Babooa

27

Phụ thuộc vào loại thông tin bạn muốn, nhưng:

openssl s_client -showcerts -connect gnupg.org:443

sẽ cung cấp cho bạn nhiều nhất, mặc dù không dễ đọc như con người như Chrome trình bày.


1
Thật không may, rất ít dữ liệu chứng chỉ được trình bày ở định dạng có thể đọc được bằng lệnh đó.
Håkan Lindqvist

9
Tôi không đồng ý với nhận xét trước đó, lệnh này cho tôi biết những gì tôi cần biết và rất hữu ích. +1 để trả lời.
camdixon

Nếu bạn đặc biệt muốn kiểm tra TLS 1.2, bạn có thể thêm -tls1_2
camdixon

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

Chỉ -p 443định quét cổng 443. Tất cả các cổng sẽ được quét nếu nó bị bỏ qua và chi tiết chứng chỉ cho bất kỳ dịch vụ SSL nào được tìm thấy sẽ được hiển thị. Nó báo --script ssl-certcho công cụ kịch bản Nmap chỉ chạy ssl-certtập lệnh. Từ tài liệu, tập lệnh này "(r) lấy chứng chỉ SSL của máy chủ. Lượng thông tin được in về chứng chỉ tùy thuộc vào mức độ chi tiết."

Đầu ra mẫu:

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

Để kiểm tra chi tiết chứng chỉ SSL, tôi sử dụng công cụ dòng lệnh sau kể từ khi có sẵn:

https://github.com/azet/tls_tools

Thật tuyệt khi kiểm tra kỹ bạn có tất cả thông tin chính xác để cấp lại certs hay xác nhận những cái hiện có, và cũng như một vài phụ thuộc nó không yêu cầu thiết lập.

Đây là những gì đầu tiên của đầu ra trông như sau:

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

Đầu ra đó được theo sau bởi toàn bộ chuỗi chứng chỉ ở cùng một mức độ chi tiết.

Những gì tôi thích điều đó thay vì là một công cụ cli trung tâm ssl như sslclient của openssl, công cụ này cố gắng chỉ làm một công việc chúng ta cần hầu hết thời gian. Tất nhiên openssl linh hoạt hơn (nghĩa là cũng kiểm tra các ứng dụng khách, imaps trên các cổng lẻ, v.v.) - nhưng tôi không luôn cần điều đó.

Ngoài ra, nếu bạn có thời gian để đào sâu & thiết lập hoặc đánh giá cao các tính năng hơn, có công cụ lớn hơn có tên sslyze (không sử dụng nó kể từ khi phụ thuộc và cài đặt ...)


5

Để hoàn thiện: nếu bạn đã cài đặt trên hệ thống Java 7 trở lên

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

hiển thị chuỗi (như được phục vụ) với gần như tất cả các chi tiết ở định dạng khá xấu xí.

Bạn có nên cài đặt Java trên hệ thống của mình không, tôi không trả lời.


rực rỡ, đầu ra mặc định hữu ích hơn nhiều so với openssl (cần giải mã).
simon

4

Tôi sử dụng một kịch bản shell cho điều này. Nó chỉ là một trình bao bọc xung quanh lệnh openssl giúp tôi không phải nhớ cú pháp.

Nó cung cấp các tùy chọn để phân tích hầu hết các thông tin chứng chỉ mà tôi thường quan tâm hoặc hiển thị đầu ra openssl thô.

Có thể truy vấn tệp chứng chỉ cục bộ hoặc máy chủ từ xa.

Sử dụng:

$ 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

Bạn có thể lấy tập lệnh tại đây: http://giantdork.org/alain/shell-script-to-check-ssl-certert-info-like-Exption-date-and-subject/


Liên kết đã chết.
Adam Matan

4

Nếu bạn muốn làm điều này trong Windows, bạn có thể sử dụng PowerShell với chức năng sau:

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
}

Điều này cho phép bạn làm một số việc gọn gàng như

#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
Điều này cần nhiều lời giải thích hơn.
Sven

đồng ý với nhu cầu giải thích, nhưng nó có hiệu quả với tôi, vì vậy +1
Jeff

2

Nếu bạn chỉ muốn ngày hết hạn (không chính xác là câu trả lời nhưng là 9/10 những gì mọi người sử dụng chi tiết chứng chỉ Chrome cho), bạn có thể sử dụng:

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

Hữu ích cho các kịch bản, vv

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.