ssl 显示收到的证书是否有 curl ?

wfypjpf4  于 2023-05-29  发布在  其他
关注(0)|答案(3)|浏览(177)

使用稍微旧一点的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-w 64-mingw 32);以前的版本是7.49.1(i686-pc-cygwin)。Curl不再显示任何证书信息,无论是否使用-k,如果TLS连接成功与否。
有没有一个选项可以把它还给我?

pu3pd22g

pu3pd22g1#

对于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-presser和his answer提供此功能的灵感。

v8wbuo2f

v8wbuo2f2#

下面是我的替换批处理文件,使用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
dddzy1tm

dddzy1tm3#

所有建议使用openssl而不是curl的答案在较新的Win服务器(以及客户端版本)上都是无效的,其中默认安装了curl.exe,但没有openssl可用。但是curl.exe能够通过使用

-w, --write-out <format>

这样的选择

-w '\n%{certs}\n'

在结果中,您会发现以下行

Subject:CN=<a host name>
Issuer:<an issuer string>
Version:2
Serial Number:<some two digit hex chars>
Signature Algorithm:sha256WithRSAEncryption
Start Date:2023-03-14 00:00:00 GMT
Expire Date:2024-04-13 23:59:59 GMT
Public Key Algorithm:rsaEncryption
RSA Public Key:2048
rsa(n):<lots of two digit hex chars>
rsa(e):0x10001
Signature:<lots of two digit hex chars>

这个答案的来源是通过仔细阅读curl online manual page找到的。检查版本:

curl.exe --version
curl 8.0.1 (Windows) libcurl/8.0.1 Schannel WinIDN
Release-Date: 2023-03-20

我需要这些信息来检查我们公司的代理是否打开SSL/TLS加密,检查它是否有恶意代码,并在将其发送给客户端之前重新加密,并以如下方式使用它:

curl.exe --ssl-no-revoke -w '\n%{certs}\n' --proxy http://proxy-server:port/ https://target-server:port/path/of/the/resource.ending

编辑:排印错误已修复

相关问题