我希望能够解决目录级身份验证及客户端证书问题。特别是想了解服务器发送哪些可接受的客户端证书。
如何使用cURL调试SSL握手过程?
我希望能够解决目录级身份验证及客户端证书问题。特别是想了解服务器发送哪些可接受的客户端证书。
如何使用cURL调试SSL握手过程?
我使用了这个命令来解决客户端证书协商问题:
openssl s_client -connect www.test.com:443 -prexit
输出通常会包含 "可接受的客户端证书颁发机构名称" 以及服务器提供的 CA 证书列表,或者可能是 "未发送客户端证书颁发机构名称",如果服务器并不总是需要客户端证书。
curl -iv https://your.domain.io
如果您不想使用openssl命令,可以使用这种方法来获取Cert和Header的输出。
实际上,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
-servername stackoverflow.com
,因为你所联系的服务器正在使用SNI(例如如果你在Cloudflare或Heroku上)。
浏览器会自动发送这个信息,但是使用CLI openssl
,你需要手动传递这个标志。 - qffopenssl s_client
而非 curl
。-msg
就能行了!-debug
可以帮助查看实际传输的内容。-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
可能curl有一些选项可以显示更多的信息,但对于这种情况,我总是使用openssl s_client
使用-debug
选项可以提供许多有用的信息
也许我应该补充说明,这也适用于非HTTP连接。所以如果你正在进行"https"连接,请尝试下面建议的curl命令。如果你不想使用或需要第二个选择,openssl s_client
可能也不错。
curl -V
查看),那么您应该尝试使用使用该SSL库的二进制文件来调试连接,例如:gnutls-cli -V www.google.com 443
- Tim Smallcurl
有一个--trace
(和--trace-ascii
)选项,可以打印基本所有内容,包括所有的SSL/TSL握手过程。由于--trace
覆盖了其他详细程度选项,所以你只需要使用它即可。
curl --trace /path/to/trace.log https://example.com
您可以阅读ietf,将日志中的消息与标准中的相应消息匹配 - 例如TLS v1.2,TLS v1.3,curl甚至打印来自标准的相应消息编号,如:
== Info: TLSv1.3 (OUT), TLS handshake, Client hello (1):
(1)
代表消息编号。
--trace-ascii
功能与--trace
相同,但不打印二进制数据。
--trace
输出 不会 包括 TLS 握手输出。哎呀! - peterh
-showcerts
结合起来,效果很好 - 谢谢! - TechmagOpenSSL 1.0.2k-fips 26 Jan 2017
时,未发送客户端证书。当请求客户端证书(通过CertificateRequest消息)时,客户端将以一个空证书列表的客户端证书消息进行响应。 - PatS