【问题标题】:Display received cert with curl?用 curl 显示收到的证书?
【发布时间】:2017-07-26 21:23:18
【问题描述】:

使用稍旧的 curl 版本,我有一个方便的批处理文件:

curl --verbose -k https://%1 2>&1 |grep -E "Connected to|subject|expire"

这将显示连接到的 IP,以及协商的实际证书的主题和到期日期,即使这不是该域名的正确证书——这有时是我们托管的问题(我们实际上是托管我们的多租户应用程序上有数千个域,其中大约一半拥有自己的证书)。

具体来说,在 grep 过滤之前,我会在 stderr 输出中看到类似的内容:

* Server certificate:
*  subject: CN=academy-fran.chi.v6.pressero.com
*  start date: Feb 22 04:55:00 2017 GMT
*  expire date: May 23 04:55:00 2017 GMT
*  issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3
*  SSL certificate verify ok.

今天我不得不在我的机器上重新安装操作系统,并重新安装了 curl。现在在版本 7.52.1 (x86_64-w64-mingw32);前一个似乎是 7.49.1 (i686-pc-cygwin)。无论是否使用 -k,无论 TLS 连接是否成功,Curl 都不再显示任何证书信息。

有没有一个选项可以把它还给我?

【问题讨论】:

    标签: ssl curl


    【解决方案1】:

    这是我的替换批处理文件,使用 openssl 而不是 curl:

    @echo off
    nslookup %1
    (openssl s_client -showcerts -servername %1 -connect %1:443 <nul |openssl x509 -text |findstr /I "DNS After") 2>nul
    

    这给了我这个输出:

    C:\>seecert www.google.com
    Server:         192.168.1.1
    Address:        192.168.1.1#53
    
    Non-authoritative answer:
    Name:   www.google.com
    Address: 172.217.10.228
    Name:   www.google.com
    Address: 2607:f8b0:4006:813::2004
    
                Not After : Aug 16 09:49:00 2018 GMT
                    DNS:www.google.com
    

    【讨论】:

      【解决方案2】:

      对于 OSX 或 Linux 上的其他任何人,您可以将其添加到您的 ~/.zshrc 文件中:

      function seecert () {
        nslookup $1
        (openssl s_client -showcerts -servername $1 -connect $1:443 <<< "Q" | openssl x509 -text | grep -iA2 "Validity")
      }
      

      示例用法,在上述添加后运行source ~/.zshrc

      % seecert www.google.com
      Server:         1.1.1.1
      Address:        1.1.1.1#53
      
      Non-authoritative answer:
      Name:   www.google.com
      Address: 172.217.10.100
      
      depth=2 OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
      verify return:1
      depth=1 C = US, O = Google Trust Services, CN = GTS CA 1O1
      verify return:1
      depth=0 C = US, ST = California, L = Mountain View, O = Google LLC, CN = www.google.com
      verify return:1
      DONE
              Validity
                  Not Before: Nov  3 07:39:18 2020 GMT
                  Not After : Jan 26 07:39:18 2021 GMT
      

      感谢 @ross-presserhis answer 提供此功能的灵感。

      【讨论】:

      • 我有点困惑——类似于我的回答,你以grep "DNS After" 结尾,但在你的示例用法输出中没有DNS AFTER
      • 你是对的。 grep "DNS After" 失败,因此不打印标准输出。您可以通过&gt; /dev/null 或简单地通过| false 实现相同的目标
      • 我已经根据你的两个 cmets 更新了上面的答案,它现在应该可以正常工作了。我最初的回答也确实错过了作为原始问题一部分的证书有效性,以及我的错误。是corrected now
      • 澄清——我的回答中的findstr /I "DNS After" 将匹配输出中的 either 字符串。不像 grep 那样进行正则表达式搜索。这就是第一次调整我的答案时@MylesSteinhauser 一定会遇到的问题。
      • @GertvandenBerg 是的,根据最近的手册页条目:openssl.org/docs/man1.1.0/man1/openssl-s_client.html#OPTIONS -proxy host:port 可以包含在上述函数中。您也可以在函数中引用规范的 HTTP_PROXY 环境变量。
      猜你喜欢
      • 1970-01-01
      • 2020-09-19
      • 2018-08-21
      • 2016-09-06
      • 2019-03-13
      • 2011-10-31
      • 1970-01-01
      • 2014-01-28
      • 2013-07-24
      相关资源
      最近更新 更多