การตั้งค่าการเชื่อมต่อ SSL และการส่งข้อมูล GET

ไม่ใช่ 100% หากนี่คือส่วนที่ถูกต้อง แต่ฉันคิดว่าเป็นเช่นนั้นเนื่องจากเป็นคำถามเกี่ยวกับวิธีการตั้งโปรแกรม

หลังจากเรียนวิชา Computer Networking ก็ได้ไอเดียสิ่งที่อยากลองทำบ้าง หนึ่งในสิ่งเหล่านี้คือการเข้าสู่หน้าเว็บที่โฮสต์อยู่ในเครื่องบน 'เราเตอร์' ของเราโดยอัตโนมัติ

ดังนั้นไซต์ดังกล่าวจึงเป็นไซต์ในพื้นที่ เช่น 192.168.150.1 - การคลิกที่ลิงก์ 'เข้าสู่ระบบฟรี' จะทำให้คุณเข้าสู่ระบบด้วยบัญชีหลอก ซึ่งเราจะเรียกว่าอลิซ (เรามีที่อยู่ IP 192.168.150.74.. ดังนั้นหากคุณคลิก ลิงก์ที่คุณจะส่งคำขอ GET เช่น:

192.168.0.1/login?dst=&username=T-Alice

ตอนนี้ฉันใช้ wireshark เพื่อตรวจสอบแพ็กเก็ตสตรีมและมันถูกเข้ารหัส - นี่คือแพ็กเก็ตสตรีม:

No.     Time        Source                Destination           Protocol Info
      1 0.000000    192.168.150.74        192.168.150.1         TCP      50704 > https [SYN] Seq=0 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSV=37133 TSER=0 WS=7
      2 0.001304    192.168.150.1         192.168.150.74        TCP      https > 50704 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1460 SACK_PERM=1 TSV=17344316 TSER=37133 WS=1
      3 0.001372    192.168.150.74        192.168.150.1         TCP      50704 > https [ACK] Seq=1 Ack=1 Win=14720 Len=0 TSV=37133 TSER=17344316
      4 0.001969    192.168.150.74        192.168.150.1         TLSv1    Client Hello
      5 0.003568    192.168.150.1         192.168.150.74        TCP      https > 50704 [ACK] Seq=1 Ack=406 Win=6864 Len=0 TSV=17344316 TSER=37133
      6 0.010537    192.168.150.1         192.168.150.74        TLSv1    Server Hello, Certificate, Server Hello Done
      7 0.010587    192.168.150.74        192.168.150.1         TCP      50704 > https [ACK] Seq=406 Ack=1132 Win=16896 Len=0 TSV=37134 TSER=17344316
      8 0.013352    192.168.150.74        192.168.150.1         TLSv1    Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
      9 0.051304    192.168.150.1         192.168.150.74        TCP      https > 50704 [ACK] Seq=1132 Ack=732 Win=7936 Len=0 TSV=17344321 TSER=37134
     10 0.269299    192.168.150.1         192.168.150.74        TLSv1    Change Cipher Spec, Encrypted Handshake Message
     11 0.270405    192.168.150.74        192.168.150.1         TLSv1    Application Data
     12 0.271888    192.168.150.1         192.168.150.74        TCP      https > 50704 [ACK] Seq=1191 Ack=1377 Win=9226 Len=0 TSV=17344343 TSER=37160
     13 0.288841    192.168.150.1         192.168.150.74        TLSv1    Application Data, Application Data
     14 0.328065    192.168.150.74        192.168.150.1         TCP      50704 > https [ACK] Seq=1377 Ack=2625 Win=19840 Len=0 TSV=37166 TSER=17344344

ตอนนี้สิ่งที่ผมอยากถาม (และทำ...) คือ:

เป็นไปได้ไหมที่จะสร้างโปรแกรม (โดยเฉพาะใน C หรือ C++ แต่ lang ไม่สำคัญเลย เว้นแต่บางโปรแกรมจะมี libs ที่ดีกว่า..) ที่ตั้งค่าการเชื่อมต่อที่ปลอดภัยนี้สำหรับฉัน เพื่อให้ฉันสามารถตั้งค่าข้อมูล GET เป็น เราเตอร์และเข้าสู่ระบบ? หรือมีวิธีโค้ดที่ง่ายกว่าในการทำเช่นนี้? ฉันสามารถปล่อยให้โปรแกรม 'เยี่ยมชม' 192.168.150.1 และปล่อยให้การสร้างแพ็กเก็ตและ SSL อยู่ที่เคอร์เนลได้หรือไม่ (--> แม้ว่าฉันคิดว่าแอปพลิเคชันจะต้องจัดการ SSL เองก็ตาม .. )

ยินดีต้อนรับทั้งโซลูชัน / คำแนะนำสำหรับ Windows และ unix .. ฉันต้องการทำสิ่งนี้สำหรับทั้งคู่

ขออภัยหากสิ่งนี้ 'น่าสับสน' ฉันพยายามถามคำถามให้ชัดเจนที่สุดเท่าที่จะทำได้ :p - ดังนั้นฉันจึงต้องการความช่วยเหลือเล็กน้อยในการส่งข้อมูล GET ไปยังเราเตอร์ ราวกับว่าฉันเยี่ยมชมหน้าด้วยตนเองและคลิกลิงก์ .


person Spyral    schedule 19.12.2012    source แหล่งที่มา


คำตอบ (2)


แน่นอนว่าเป็นไปได้ คุณเพียงแค่ต้องดำเนินการตามลำดับต่อไปนี้:

  1. สร้างการเชื่อมต่อ SSL ไปยังเซิร์ฟเวอร์ HTTPS
  2. ส่งคำขอ HTTP GET
  3. อ่านการตอบกลับจากเซิร์ฟเวอร์
  4. แยกวิเคราะห์เนื้อหา HTML ในการตอบกลับ HTTP

มีตัวอย่างมากมายในการขอหน้า HTTP จากเซิร์ฟเวอร์โดยใช้ openssl ฉันพบ หนึ่ง โดยค้นหา 'openssl https example' บน Google ความท้าทายที่แท้จริงในความคิดของฉันคือการแยกวิเคราะห์เนื้อหา HTML ที่ได้รับการกล่าวถึงแล้วใน stackoverflow .

ฉันขอแนะนำให้คุณลองใช้ Python ก่อนที่จะนำไปใช้ใน C ++ โชคดี!

person Gearoid Murphy    schedule 19.12.2012
comment
เหตุใดจึงแนะนำให้ลองใช้ใน python ก่อน (ในขณะที่บทช่วยสอนที่คุณให้ไว้เป็นตัวอย่าง c++ ^^ - person Spyral; 19.12.2012
comment
คำถามถูกแท็กเป็น C++ ดังนั้นเอกสารประกอบที่ฉันให้ไว้จะสะท้อนถึงสิ่งนั้น Python เป็นภาษาต้นแบบที่ยอดเยี่ยม ฉันใช้มันตลอดเวลาเพื่อทดสอบแนวคิดและอัลกอริธึม ก่อนที่จะยอมรับสภาพแวดล้อม C++ ที่ให้อภัยน้อยลง (และมีประสิทธิภาพมากกว่ามาก) - person Gearoid Murphy; 19.12.2012

หากคุณต้องการจัดการการเขียนโปรแกรม HTTP (การส่งคำสั่ง GET และอื่นๆ) ด้วยตัวเองจริงๆ อาจเพื่อการเรียนรู้ แต่มีบางสิ่งที่ดูแล SSL/TLS ให้กับคุณ คุณสามารถใช้บางอย่างเช่น stunnel กับเซิร์ฟเวอร์นั้น และใช้ แอปพลิเคชันของคุณเองเพื่อเชื่อมต่อปลายอุโมงค์ในพื้นที่

โดยทั่วไป ตัวเลือกที่ดีกว่าคือการใช้ไลบรารี HTTP ที่รองรับ SSL/TLS ด้วย Libcurl เป็นตัวอย่างที่ดีของสิ่งนี้

person Bruno    schedule 19.12.2012
comment
+1 สำหรับ libcurl มีตัวอย่างที่ดีมากมายบนไซต์ libcurl - curl.haxx.se/libcurl/c/example .html - person qrdl; 19.12.2012