如何使用cURL调试SSL握手?

106

我希望能够解决目录级身份验证及客户端证书问题。特别是想了解服务器发送哪些可接受的客户端证书。

如何使用cURL调试SSL握手过程?

6个回答

113

我使用了这个命令来解决客户端证书协商问题:

openssl s_client -connect www.test.com:443 -prexit

输出通常会包含 "可接受的客户端证书颁发机构名称" 以及服务器提供的 CA 证书列表,或者可能是 "未发送客户端证书颁发机构名称",如果服务器并不总是需要客户端证书。


显然,“openssl s_client..”仅检查证书链,而不检查HTTP请求本身中的名称。我遇到了一些openssl喜欢但curl不喜欢的证书问题。 - radiospiel
4
我将上面的内容与-showcerts结合起来,效果很好 - 谢谢! - Techmag
我尝试查找已发送的客户端证书,并使用该命令查看是否会显示它。但没有显示。在我的情况下,使用版本 OpenSSL 1.0.2k-fips 26 Jan 2017 时,未发送客户端证书。当请求客户端证书(通过CertificateRequest消息)时,客户端将以一个空证书列表的客户端证书消息进行响应。 - PatS

57
curl -iv https://your.domain.io

如果您不想使用openssl命令,可以使用这种方法来获取Cert和Header的输出。


2
我有什么遗漏吗?这只打印证书信息,不像“openssl s_client”那样转储它。:-/ - Yan Foto

16

实际上,openssl 命令比 curl 更适合用于检查和调试 SSL。以下是一个使用 openssl 的示例:

openssl s_client -showcerts -connect stackoverflow.com:443 < /dev/null

在添加EOL到标准输入(否则终端会停留在此)、< /dev/null的作用是给命令行指令一个结尾。


但如果你想的话,你可以使用curl将一些有用的openssl命令包装起来,使其更加人性化易读(就像我在curly中所做的那样):

# check if SSL is valid
>>> curly --ssl valid -d stackoverflow.com
Verify return code: 0 (ok)
issuer=C = US
O = Let's Encrypt
CN = R3
subject=CN = *.stackexchange.com

option: ssl
action: valid
status: OK

# check how many days it will be valid 
>>> curly --ssl date -d stackoverflow.com
Verify return code: 0 (ok)
from: Tue Feb  9 16:13:16 UTC 2021
till: Mon May 10 16:13:16 UTC 2021
days total:  89
days passed: 8
days left:   81

option: ssl
action: date
status: OK

# check which names it supports
curly --ssl name -d stackoverflow.com
*.askubuntu.com
*.blogoverflow.com
*.mathoverflow.net
*.meta.stackexchange.com
*.meta.stackoverflow.com
*.serverfault.com
*.sstatic.net
*.stackexchange.com
*.stackoverflow.com
*.stackoverflow.email
*.superuser.com
askubuntu.com
blogoverflow.com
mathoverflow.net
openid.stackauth.com
serverfault.com
sstatic.net
stackapps.com
stackauth.com
stackexchange.com
stackoverflow.blog
stackoverflow.com
stackoverflow.email
stacksnippets.net
superuser.com

option: ssl
action: name
status: OK

# check the CERT of the SSL
>>> curly --ssl cert -d stackoverflow.com
-----BEGIN CERTIFICATE-----
MIIG9DCCBdygAwIBAgISBOh5mcfyJFrMPr3vuAuikAYwMA0GCSqGSIb3DQEBCwUA
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
EwJSMzAeFw0yMTAyMDkxNjEzMTZaFw0yMTA1MTAxNjEzMTZaMB4xHDAaBgNVBAMM
Eyouc3RhY2tleGNoYW5nZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDRDObYpjCvb2smnCP+UUpkKdSr6nVsIN8vkI6YlJfC4xC72bY2v38lE2xB
LCaL9MzKhsINrQZRIUivnEHuDOZyJ3Xwmxq3wY0qUKo2c963U7ZJpsIFsj37L1Ac
Qp4pubyyKPxTeFAzKbpfwhNml633Ao78Cy/l/sYjNFhMPoBN4LYBX7/WJNIfc3UZ
niMfh230NE2dwoXGqA0MnkPQyFKlIwHcmMb+ZI5T8TziYq0WQiYUY3ssOEu1CI5n
wh0+BTAwpx7XBUe5Z+B9SrFp8BUDYWcWuVEIh2btYvo763mrr+lmm8PP23XKkE4f
287Iwlfg/IqxxIxKv9smFoPkyZcFAgMBAAGjggQWMIIEEjAOBgNVHQ8BAf8EBAMC
BaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAw
HQYDVR0OBBYEFMnjX41T+J1bbLgG9TjR/4CvHLv/MB8GA1UdIwQYMBaAFBQusxe3
WFbLrlAJQOYfr52LFMLGMFUGCCsGAQUFBwEBBEkwRzAhBggrBgEFBQcwAYYVaHR0
cDovL3IzLm8ubGVuY3Iub3JnMCIGCCsGAQUFBzAChhZodHRwOi8vcjMuaS5sZW5j
ci5vcmcvMIIB5AYDVR0RBIIB2zCCAdeCDyouYXNrdWJ1bnR1LmNvbYISKi5ibG9n
b3ZlcmZsb3cuY29tghIqLm1hdGhvdmVyZmxvdy5uZXSCGCoubWV0YS5zdGFja2V4
Y2hhbmdlLmNvbYIYKi5tZXRhLnN0YWNrb3ZlcmZsb3cuY29tghEqLnNlcnZlcmZh
dWx0LmNvbYINKi5zc3RhdGljLm5ldIITKi5zdGFja2V4Y2hhbmdlLmNvbYITKi5z
dGFja292ZXJmbG93LmNvbYIVKi5zdGFja292ZXJmbG93LmVtYWlsgg8qLnN1cGVy
dXNlci5jb22CDWFza3VidW50dS5jb22CEGJsb2dvdmVyZmxvdy5jb22CEG1hdGhv
dmVyZmxvdy5uZXSCFG9wZW5pZC5zdGFja2F1dGguY29tgg9zZXJ2ZXJmYXVsdC5j
b22CC3NzdGF0aWMubmV0gg1zdGFja2FwcHMuY29tgg1zdGFja2F1dGguY29tghFz
dGFja2V4Y2hhbmdlLmNvbYISc3RhY2tvdmVyZmxvdy5ibG9nghFzdGFja292ZXJm
bG93LmNvbYITc3RhY2tvdmVyZmxvdy5lbWFpbIIRc3RhY2tzbmlwcGV0cy5uZXSC
DXN1cGVydXNlci5jb20wTAYDVR0gBEUwQzAIBgZngQwBAgEwNwYLKwYBBAGC3xMB
AQEwKDAmBggrBgEFBQcCARYaaHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwggEE
BgorBgEEAdZ5AgQCBIH1BIHyAPAAdgBElGUusO7Or8RAB9io/ijA2uaCvtjLMbU/
0zOWtbaBqAAAAXeHyHI8AAAEAwBHMEUCIQDnzDcCrmCPdfgcb/ojY0WJV1rCj+uE
hCiQi0+4fBP9lgIgSI5mwEqBmVcQwRfKikUzhkH0w6K/6wq0e/1zJA0j5a4AdgD2
XJQv0XcwIhRUGAgwlFaO400TGTO/3wwvIAvMTvFk4wAAAXeHyHIoAAAEAwBHMEUC
IHd0ZLB3j0b31Sh/D3RIfF8C31NxIRSG6m/BFSCGlxSWAiEAvYlgPjrPcBZpX4Xm
SdkF39KbVicTGnFOSAqDpRB3IJwwDQYJKoZIhvcNAQELBQADggEBABZ+2WXyP4w/
A+jJtBgKTZQsA5VhUCabAFDEZdnlWWcV3WYrz4iuJjp5v6kL4MNzAvAVzyCTqD1T
m7EUn/usz59m02mZF82+ELLW6Mqix8krYZTpYt7Hu3Znf6HxiK3QrjEIVlwSGkjV
XMCzOHdALreTkB+UJaL6bEs1sB+9h20zSnZAKrPokGL/XwgxUclXIQXr1uDAShJB
Ts0yjoSY9D687W9sjhq+BIjNYIWg1n9NJ7HM48FWBCDmV3NlCR0Zh1Yx15pXCUhb
UqWd6RzoSLmIfdOxgfi9uRSUe0QTZ9o/Fs4YoMi5K50tfRycLKW+BoYDgde37As5
0pCUFwVVH2E=
-----END CERTIFICATE-----

option: ssl
action: cert
status: OK

1
在许多情况下,你也需要加上 -servername stackoverflow.com,因为你所联系的服务器正在使用SNI(例如如果你在Cloudflare或Heroku上)。 浏览器会自动发送这个信息,但是使用CLI openssl,你需要手动传递这个标志。 - qff

16
  1. 如需进行 TLS 握手故障排除,请使用 openssl s_client 而非 curl
  2. -msg 就能行了!
  3. -debug 可以帮助查看实际传输的内容。
  4. -status OCSP Stapling 现在应该成为标准了。
openssl s_client -connect example.com:443 -tls1_2 -status -msg -debug -CAfile <path to trusted root ca pem> -key <path to client private key pem> -cert <path to client cert pem> 

其他有用的开关:-tlsextdebug-prexit-state

https://www.openssl.org/docs/man1.0.2/man1/s_client.html


这非常有用。适用于2023年7月! - RukshanJS

15

可能curl有一些选项可以显示更多的信息,但对于这种情况,我总是使用openssl s_client

使用-debug选项可以提供许多有用的信息

也许我应该补充说明,这也适用于非HTTP连接。所以如果你正在进行"https"连接,请尝试下面建议的curl命令。如果你不想使用或需要第二个选择,openssl s_client可能也不错。


5
注意,如果您的curl版本编译时使用了不同的SSL库(例如GnuTLS而非openssl - 可以使用 curl -V 查看),那么您应该尝试使用使用该SSL库的二进制文件来调试连接,例如:gnutls-cli -V www.google.com 443 - Tim Small

7

curl有一个--trace(和--trace-ascii)选项,可以打印基本所有内容,包括所有的SSL/TSL握手过程。由于--trace覆盖了其他详细程度选项,所以你只需要使用它即可。

curl --trace /path/to/trace.log https://example.com

您可以阅读ietf,将日志中的消息与标准中的相应消息匹配 - 例如TLS v1.2TLS v1.3,curl甚至打印来自标准的相应消息编号,如:

== Info: TLSv1.3 (OUT), TLS handshake, Client hello (1):

(1)代表消息编号。

--trace-ascii功能与--trace相同,但不打印二进制数据。


4
据我所知,只有当 curl 链接了 OpenSSL(或者可能是 GnuTLS)时,您才能看到 TLS 握手信息。我的 curl 使用的是 NSS(这在 Fedora、RedHat 和 CentOS 直到最近都是真实的情况),因此 --trace 输出 不会 包括 TLS 握手输出。哎呀! - peterh
@peterh 哎呀,听起来浪费了几个小时,我会把这个加入到答案中。 - dualed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接