curl -vvv का उपयोग करके HTTPS (TLS संचार) को सरल तरीके से देखना
नमस्ते, मैं मुनो हूँ।
परिचय
HTTPS स्वयं एक TLS संचार है, और जैसा कि HTTP over TLS में है, HTTP संचार को TLS संचार में लपेटा जाता है। यदि केवल TLS संचार पर ध्यान केंद्रित किया जाए, तो यह HTTPS संचार का समर्थन करने वाले डोमेन के लिए अनुरोध से भिन्न हो जाएगा, इसलिए आप curl -vvv के साथ विस्तृत डीबगिंग करके client hello से संचार की पुष्टि कर सकते हैं। हालांकि, मैंने इसे संयोग से पाया।
आइए देखें
तो, आइए इसे इस प्रकार देखें:
curl -vvv -sl
-vvv # विस्तृत डीबगिंग विकल्प
-s # साइलेंट मोड, वैकल्पिक
-I # केवल हेडर को मानक आउटपुट पर प्रिंट करें
तो, आइए देखें।
$ curl -vvv https://soulminingrig.com/ -sI
19:30:07.019276 [0-x] == Info: [READ] client_reset, clear readers
19:30:07.064770 [0-0] == Info: Host soulminingrig.com:443 was resolved.
19:30:07.065031 [0-0] == Info: IPv6: (none)
19:30:07.065180 [0-0] == Info: IPv4: 167.179.75.206
19:30:07.065413 [0-0] == Info: [HTTPS-CONNECT] adding wanted h2
19:30:07.065587 [0-0] == Info: [HTTPS-CONNECT] added
19:30:07.065718 [0-0] == Info: [HTTPS-CONNECT] connect, init
19:30:07.065881 [0-0] == Info: Trying 167.179.75.206:443...
19:30:07.066065 [0-0] == Info: [HTTPS-CONNECT] connect -> 0, done=0
19:30:07.066197 [0-0] == Info: [HTTPS-CONNECT] Curl_conn_connect(block=0) -> 0, done=0
19:30:07.066400 [0-0] == Info: [HTTPS-CONNECT] adjust_pollset -> 1 socks
19:30:07.083945 [0-0] == Info: [HTTPS-CONNECT] connect -> 0, done=0
19:30:07.084308 [0-0] == Info: [HTTPS-CONNECT] Curl_conn_connect(block=0) -> 0, done=0
19:30:07.084750 [0-0] == Info: [HTTPS-CONNECT] adjust_pollset -> 1 socks
19:30:07.095330 [0-0] == Info: [SSL] cf_connect()
19:30:07.095574 [0-0] == Info: [SSL] ossl_connect, step1
19:30:07.098502 [0-0] == Info: ALPN: curl offers h2,http/1.1
19:30:07.098614 [0-0] == Info: [SSL] ossl_connect, step2
19:30:07.099069 [0-0] => Send SSL data, 5 bytes (0x5)
0000: .....
19:30:07.099205 [0-0] == Info: TLSv1.3 (OUT), TLS handshake, Client hello (1):
19:30:07.099360 [0-0] => Send SSL data, 1563 bytes (0x61b)
~省略~
और, बहुत सारी स्ट्रिंग्स दिखाई दीं...
संचार की पुष्टि
यहां, पोर्ट 443 पर DNS नाम रिज़ॉल्यूशन सफल रहा।
19:30:07.064770 [0-0] == Info: Host soulminingrig.com:443 was resolved.
यहां, h2, HTTP/2 पर कनेक्शन का अनुरोध किया गया और कनेक्शन स्थापित हो गया।
19:30:07.065413 [0-0] == Info: [HTTPS-CONNECT] adding wanted h2
19:30:07.065587 [0-0] == Info: [HTTPS-CONNECT] added
19:30:07.065718 [0-0] == Info: [HTTPS-CONNECT] connect, init
19:30:07.065881 [0-0] == Info: Trying 167.179.75.206:443...
19:30:07.066065 [0-0] == Info: [HTTPS-CONNECT] connect -> 0, done=0
और अंत में SSL/TLS संचार शुरू हुआ।
19:30:07.095330 [0-0] == Info: [SSL] cf_connect()
19:30:07.095574 [0-0] == Info: [SSL] ossl_connect, step1
19:30:07.098502 [0-0] == Info: ALPN: curl offers h2,http/1.1
19:30:07.098614 [0-0] == Info: [SSL] ossl_connect, step2
19:30:07.099069 [0-0] => Send SSL data, 5 bytes (0x5)
और फिर, TLS1.3 के साथ, प्रोटोकॉल पर client hello का TLS हैंडशेक अंततः शुरू हुआ!
19:30:07.099205 [0-0] == Info: TLSv1.3 (OUT), TLS handshake, Client hello (1):
क्लाइंट के ट्रांसमिशन के रूप में पैकेट भेजना शुरू होता है।
19:30:07.099205 [0-0] == Info: TLSv1.3 (OUT), TLS handshake, Client hello (1):
19:30:07.099360 [0-0] => Send SSL data, 1563 bytes (0x61b)
0000: .........r.q.....GC...._4....k..C.P... ..?...x...HT..09..z4b....
0040: ..,9....<.......,.0.........+./...$.(.k.#.'.g.....9.....3.....=.
0080: <.5./..................soulminingrig.com........................
00c0: .............h2.http/1.1.........1.....6.4......................
0100: ...............................+........-.....3...........RIw..7
इस बिंदु पर, यदि अनुरोध में डोमेन soulminingrig.com सादे पाठ में भेजा जाता है और सर्वर SNI का समर्थन करता है, तो यह सुसंगत होगा।
19:30:07.105068 [0-0] == Info: [SSL] ossl_bio_cf_out_write(len=1568) -> 0, 1568
19:30:07.105244 [0-0] == Info: [SSL] ossl_bio_cf_in_read(len=5) -> 81, 0
19:30:07.105355 [0-0] == Info: [SSL] ossl_populate_x509_store, path=/etc/ssl/certs/ca-certificates.crt, blob=0
19:30:07.114557 [0-0] == Info: CAfile: /etc/ssl/certs/ca-certificates.crt
19:30:07.114669 [0-0] == Info: CApath: none
19:30:07.114768 [0-0] == Info: [SSL] SSL_connect() -> err=-1, detail=2
19:30:07.114903 [0-0] == Info: [SSL] SSL_connect() -> want recv
19:30:07.115050 [0-0] == Info: [SSL] cf_connect() -> 0, done=0
इस बिंदु पर, क्लाइंट के पास मौजूद रूट प्रमाणपत्र तैयार किया गया है।
कनेक्शन अभी तक स्थापित नहीं हुआ है।
Let’s Encrypt के मामले में, यह ISRG Root X1 से मेल खाता प्रतीत होता है।
Chain of Trust - Let’s Encrypt
$ grep -A 3 "ISRG Root X1" /etc/ssl/certs/ca-certificates.crt
# ISRG Root X1
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
और फिर Server Hello वापस आ गया!
19:30:07.178149 [0-0] == Info: [SSL] ossl_bio_cf_in_read(len=122) -> 0, 122
19:30:07.178363 [0-0] == Info: TLSv1.3 (IN), TLS handshake, Server hello (2):
19:30:07.178583 [0-0] <= Recv SSL data, 122 bytes (0x7a)
0000: ...v....y'...>........&.....,5O....... ..?...x...HT..09..z4b....
0040: ..,9.........+.....3.$... F........`~..l[..uhE..F.P?..V..6
19:30:07.179600 [0-0] == Info: [SSL] ossl_bio_cf_in_read(len=5) -> 0, 5
19:30:07.179730 [0-0] <= Recv SSL data, 5 bytes (0x5)
और फिर, सर्वर से प्रमाणपत्र वापस आ गया।
19:30:07.183139 [0-0] <= Recv SSL data, 2049 bytes (0x801)
0000: ...........0...0.................g...4...C..0...*.H.=...021.0...
0040: U....US1.0...U....Let's Encrypt1.0...U....E50...250714140356Z..2
0080: 51012140355Z0.1.0...U....soulminingrig.com0Y0...*.H.=....*.H.=..
00c0: ..B...V...$.....}.hN.f......n@F&...GR.....-.....?z]6d.=..<..eu..
सर्वर के पास मौजूद निजी कुंजी का उपयोग करके एक हस्ताक्षर भेजा गया था।
0000: .
19:30:07.199683 [0-0] == Info: TLSv1.3 (IN), TLS handshake, CERT verify (15):
19:30:07.199941 [0-0] <= Recv SSL data, 79 bytes (0x4f)
यहां, TLS हैंडशेक अंततः समाप्त हो गया और स्थापित हो गया।
19:30:07.202057 [0-0] == Info: TLSv1.3 (IN), TLS handshake, Finished (20):
एक TLS हैंडशेक जो अक्सर नहीं देखा जाता
शुरुआत में, जब मैंने ChatGPT आदि से पूछा, तो मुझे Wireshark जैसे उपकरणों का उपयोग करने के लिए कहा गया, लेकिन Wireshark में अक्सर बहुत शोर होता है, इसलिए मैं सोच रहा था कि क्या कोई सरल तरीका है जिससे मैं इसकी पुष्टि कर सकूं, और फिर मुझे याद आया और मैंने कोशिश की, और यह काम कर गया।
TLS हैंडशेक विफल होने के पैटर्न के रूप में, निम्नलिखित की जांच करना भी दिलचस्प हो सकता है।
badssl.com
$ curl -vvv -sl https://wrong.host.badssl.com/
19:50:53.161049 [0-x] == Info: [READ] client_reset, clear readers
19:50:53.202041 [0-0] == Info: Host wrong.host.badssl.com:443 was resolved.
19:50:53.202233 [0-0] == Info: IPv6: (none)
19:50:53.202326 [0-0] == Info: IPv4: 104.154.89.105
19:50:53.202496 [0-0] == Info: [HTTPS-CONNECT] adding wanted h2
~~~
19:50:53.759424 [0-0] == Info: SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256 / secp256r1 / rsaEncryption
19:50:53.759894 [0-0] == Info: ALPN: server accepted http/1.1
19:50:53.760124 [0-0] == Info: [SSL] ossl_connect, step3
19:50:53.760337 [0-0] == Info: Server certificate:
19:50:53.760541 [0-0] == Info: subject: CN=*.badssl.com
19:50:53.760763 [0-0] == Info: start date: Jul 15 20:02:58 2025 GMT
19:50:53.761029 [0-0] == Info: expire date: Oct 13 20:02:57 2025 GMT
19:50:53.761406 [0-0] == Info: subjectAltName does not match hostname wrong.host.badssl.com
19:50:53.761853 [0-0] == Info: SSL: no alternative certificate subject name matches target hostname 'wrong.host.badssl.com'
19:50:53.762409 [0-0] == Info: [SSL] cf_connect() -> 60, done=0
इस मामले में, प्रमाणपत्र *.badssl.com के लिए प्राप्त किया गया था, जबकि इसे *.host.badssl.com के लिए वाइल्डकार्ड प्रमाणपत्र प्राप्त करना चाहिए था, इसलिए यह गलत होने के कारण त्रुटि दे रहा है।
तो, फिर मिलेंगे। धन्यवाद।