使用 CLI 工具显示远程 SSL 证书详细信息

Ada*_*tan 321 ssl ssl-certificate curl

在 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: */*
Run Code Online (Sandbox Code Playgroud)

知道如何从命令行工具(cURL 或其他)获取完整的证书信息吗?

Ped*_*rez 423

您应该能够将 OpenSSL 用于您的目的:

echo | openssl s_client -showcerts -servername gnupg.org -connect gnupg.org:443 2>/dev/null | openssl x509 -inform pem -noout -text
Run Code Online (Sandbox Code Playgroud)

该命令连接到所需的网站,并将 PEM 格式的证书通过管道传输到另一个读取和解析详细信息的 openssl 命令。

(请注意,“冗余”-servername参数是openssl使用 SNI 支持进行请求所必需的。)

  • 请注意,虽然 s_client 将打印整个链,但最后一个管道命令将仅打印有关第一个证书的信息。 (6认同)
  • 如果你只想知道**到期日期**,你可以用`-enddate`替换`-text`,检查其他选项([`openssl x509 help`](https://wiki.openssl.org /index.php/Command_Line_Utilities#Certificates_AKA_x509))。 (5认同)
  • @AdamMatan 您是否在第二个管道后包含完整命令?错误消息看起来像第二次 openssl 调用最终以交互模式运行(即 `openssl` 与 `openssl x509 -inform pem -noout -text`)。Pedro 写的东西对我来说很好用。 (2认同)
  • (已修复)@hemp:“echo”本身会输出一个换行符,然后退出,这会导致管道将 EOF 返回到 openssl,这实际上是导致 openssl 完成的原因。使用 `</dev/null` 进行重定向(或者 Windows `<NUL:`,但不适用于 2016 年之前的 OpenSSL 版本,这里有一个 bug)也可以工作,而且在我看来甚至更好。 (2认同)

Ant*_*sta 126

简单的解决方案

这是我的日常脚本:

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

输出:

* 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
Run Code Online (Sandbox Code Playgroud)

  • 对我不起作用,不包括开始/到期日期。 (9认同)
  • 由于 curl 最近发生了一些变化(介于 49 和 52 之间),因此根本不显示有关证书的任何信息。:( (8认同)
  • 这也不显示该证书上的备用名称。 (2认同)

小智 55

nmap -p 443 --script ssl-cert gnupg.org
Run Code Online (Sandbox Code Playgroud)

-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
Run Code Online (Sandbox Code Playgroud)

  • 如果您需要查看证书的指纹,那么此命令比其他答案中的“curl -v”建议要好得多。 (2认同)
  • 这是该线程中唯一显示证书的使用者备用名称的线程。 (2认同)
  • 这甚至支持 SNI(通过 `--script-args=tls.servername=DOMAINNAME`)。 (2认同)

fak*_*ker 35

取决于你想要什么样的信息,但是:

openssl s_client -showcerts -connect gnupg.org:443
Run Code Online (Sandbox Code Playgroud)

应该给你最多的,虽然不像 Chrome 呈现的那样易于人类阅读。

  • 我不同意之前的评论,这个命令告诉我我需要知道什么并且非常有用。+1 回答。 (10认同)
  • 不幸的是,该命令很少以人类可读的格式显示证书数据。 (2认同)

dav*_*085 24

为了完整起见:如果您的系统上安装了Java 7 或更高版本

 keytool -printcert -sslserver $host[:$port]
Run Code Online (Sandbox Code Playgroud)

以相当丑陋的格式显示几乎所有细节的(按服务)。

你是否应该在你的系统上安装 Java 我不回答。


Flo*_*igl 7

要检查 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 
Run Code Online (Sandbox Code Playgroud)

该输出之后是具有相同详细程度的整个证书链。

我喜欢它而不是像 openssl 的 s_client 这样的以 ssl 为中心的 cli 工具,这个工具试图只做我们大部分时间需要的一项工作。当然,openssl 更灵活(即还检查客户端证书、奇数端口上的 imap 等) - 但我并不总是需要它。

或者,如果您有时间深入了解和设置或欣赏更多功能,还有名为 sslyze 的更大工具(由于依赖项和安装而未使用它...)


c4u*_*elf 7

如果您只想要到期日期(这不完全是答案,而是人们使用 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
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您想在 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
}
Run Code Online (Sandbox Code Playgroud)

这允许你做一些整洁的事情,比如

#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*
Run Code Online (Sandbox Code Playgroud)