CLIツールを使用したリモートSSL証明書の詳細の表示


187

Chromeで、緑色のHTTPSロックアイコンをクリックすると、証明書の詳細を示すウィンドウが開きます。

ここに画像の説明を入力してください

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またはその他)から完全な証明書情報を取得する方法はありますか?



おそらくバージョンにも依存しています。現在のcurlwithフラグに--verboseは、サーバー証明書のコンテンツ全体が表示されます。
パトリックメヴゼク

回答:


263

OpenSSLを目的に使用できる必要があります。

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

そのコマンドは、目的のWebサイトに接続し、PEM形式の証明書を、詳細を読み取り、解析する別のopensslコマンドにパイプします。

(SNIサポートで要求を行うに-servernameは、「冗長」パラメーターが必要であることに注意してくださいopenssl。)


このコマンドを使用して、エラーがあるようです:OpenSSL> openssl:Error: 'CONNECTED(00000003)' is an invalid command.
アダムMatan

2
@AdamMatan 2番目のパイプの後に完全なコマンドを含めましたか?エラーメッセージは、2回目のopenssl呼び出しが対話モード(opensslvsなどopenssl x509 -inform pem -noout -text)で実行されたように見えます。Pedroが書いたものは私にとってはうまくいきます。
ホーカンLindqvist

4
s_clientはチェーン全体を出力しますが、最後のパイプコマンドは最初の証明書に関する情報のみを出力することに注意してください。
チャッツ

1
echoそれ自体はecho ''..と同等です。空の文字列をstdoutに送信します。cat /dev/null |動作しますが、もう少し説明が必要です。

2
有効期限のみを知りたい場合-text-enddate、に置き換えて、他のオプションを確認してください(openssl x509 help)。
アドリアーン

63

シンプルなソリューション

それが私の日常のスクリプトです:

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

5
私には機能しません。開始日/有効期限は含まれていません。
ランドバーグあたり

4
最近のcurlの変更(49〜52)以来、これは証明書について何も表示しません。:(
ロスプレッサー

2を削除>&1
Jeshan Babooa

27

必要な情報の種類によって異なりますが、次のとおりです。

openssl s_client -showcerts -connect gnupg.org:443

Chromeが提示するほど人間に読みやすいものではありませんが、ほとんどの場合に役立つはずです。


1
残念ながら、そのコマンドでは、人間が読み取れる形式で証明書データはほとんど表示されません。
ホーカンLindqvist

9
私は以前のコメントに同意しません、このコマンドは私が知る必要があることを教えてくれ、非常に便利です。答えは+1。
カムディクソン

TLS 1.2をテストする場合は、-tls1_2
camdixon

23
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

6

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 

その出力の後に、同じ詳細レベルで証明書チェーン全体が続きます。

私が気に入っているのは、opensslのs_clientのようなSSL中心のCLIツールではなく、ほとんどの場合に必要な1つのジョブを実行しようとすることです。もちろん、opensslはより柔軟です(つまり、clientcerts、奇数ポートのimapなどをチェックします)-しかし、私は常にそれを必要としません。

あるいは、掘り下げてセットアップする時間がある場合、またはより多くの機能を評価する場合は、sslyzeという名前の大きなツールがあります(依存関係とインストールのために使用しない...)


5

完全を期すため:システムにJava 7以降をインストールしている場合

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

は、ほとんどすべての詳細がほとんど見苦しい形式のチェーン(提供されているとおり)を示しています。

システムにJavaをインストールする必要があるかどうかは答えません。


openssl(デコードが必要)よりもはるかに便利なデフォルト出力。
サイモン

4

これにはシェルスクリプトを使用します。これは、opensslコマンドの単なるラッパーであり、構文を覚えておく必要がありません。

私が通常興味のある証明書情報のほとんどを解析するためのオプションを提供するか、生の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/


リンクは無効です。
アダムMatan

4

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*


2

有効期限のみが必要な場合(正確な答えではありませんが、Chrome証明書の詳細を使用する対象は9/10です)、次を使用できます。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.