curl -vvv দিয়ে HTTPS (TLS যোগাযোগ) সহজে দেখা

12 min

language: ja bn en es hi pt ru zh-cn zh-tw

শুভ সকাল, আমি অযোগ্য।

ভূমিকা

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

এই মুহূর্তে, ক্লায়েন্টের Root সার্টিফিকেট প্রস্তুত করা হয়েছে।
সংযোগ এখনও প্রতিষ্ঠিত হয়নি।
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 এর জন্য ওয়াইল্ডকার্ড সার্টিফিকেট নেওয়া উচিত ছিল, তাই এটি ভুল করার জন্য অভিযোগ করা হচ্ছে।

তাহলে আবার দেখা হবে। শুভেচ্ছা রইল।

Related Posts