【问题标题】:How to debug SSL handshake using cURL?如何使用 cURL 调试 SSL 握手?
【发布时间】:2013-07-18 11:57:03
【问题描述】:

我想对使用客户端证书的每个目录身份验证进行故障排除。我特别想知道服务器发送哪些可接受的客户端证书。

如何调试 SSL 握手,最好使用 cURL?

【问题讨论】:

    标签: curl ssl client-certificates


    【解决方案1】:

    我已使用此命令对客户端证书协商进行故障排除:

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

    如果服务器并不总是需要客户端证书,则输出可能包含“可接受的客户端证书 CA 名称”和来自服务器的 CA 证书列表,或者可能包含“未发送客户端证书 CA 名称”。

    【讨论】:

    • 显然 'openssl s_client ..' 只检查证书链,但不检查 HTTP 请求本身的名称。我为一些 openssl 喜欢的证书而苦苦挣扎,但 curl 却没有..
    • 我将上面的内容与-showcerts 结合起来,效果非常好 - 谢谢!
    【解决方案2】:
    curl -iv https://your.domain.io
    

    如果您不想使用 openssl 命令,这将为您提供证书和标头输出。

    【讨论】:

      【解决方案3】:

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

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

      也许我应该补充一点,这也适用于非 HTTP 连接。因此,如果您正在执行“https”,请尝试下面建议的 curl 命令。如果您不是或想要第二个选项openssl s_client 可能会很好

      【讨论】:

      • 请注意,如果您的 curl 版本是针对不同的 SSL 库编译的,例如 GnuTLS(而不是 openssl - 检查使用 curl -V),那么您应该尝试使用使用的二进制文件调试您的连接那个 SSL 库,例如gnutls-cli -V www.google.com 443
      【解决方案4】:
      1. 对于 TLS 握手故障排除,请使用 openssl s_client 而不是 curl
      2. -msg 成功了!
      3. -debug 有助于查看实际通过套接字传输的内容。
      4. -status OCSP 装订现在应该是标准配置。
      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

      【讨论】:

        【解决方案5】:

        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 一样工作,但不打印二进制数据。

        【讨论】:

          【解决方案6】:

          实际上openssl 命令是比curl 更好的检查和调试SSL 的工具。这是openssl 的示例:

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

          &lt; /dev/null 用于将EOL 添加到STDIN,否则它会挂在终端上。


          但是,如果您喜欢,您可以使用 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 您必须手动传递此标志。
          【解决方案7】:
          openssl s_client -connect 127.0.0.1:6379 -state
          CONNECTED(00000003)
          SSL_connect:before SSL initialization
          SSL_connect:SSLv3/TLS write client hello
          

          【讨论】:

            猜你喜欢
            • 2015-05-19
            • 2016-04-19
            • 1970-01-01
            • 2021-06-22
            • 2018-04-14
            • 1970-01-01
            • 2016-05-02
            • 2012-01-16
            • 1970-01-01
            相关资源
            最近更新 更多