พร็อกซี HTTP และ HTTPS

พร็อกซี HTTP และ HTTPS

พร็อกซี HTTP รับคำขอเว็บจากเบราว์เซอร์หรือแอปพลิเคชัน แล้วเชื่อมต่อปลายทางแทนคุณ โดยส่งได้ทั้งทราฟฟิก HTTP ปกติและทราฟฟิก HTTPS ที่เข้ารหัสเมื่อรองรับเมธอด CONNECT ส่วนพร็อกซี HTTPS เพิ่มการเข้ารหัสให้การเชื่อมต่อระหว่างแอปพลิเคชันกับตัวพร็อกซีเอง

นี่เป็นทางเลือกแยกกันสองเรื่อง คือแอปพลิเคชันเข้าถึงพร็อกซีอย่างไร และสื่อสารกับเว็บไซต์ผ่านพร็อกซีนั้นอย่างไร การเข้าใจทั้งสองช่วยเลือกการตั้งค่าได้ถูกต้อง ส่วนการเลือกโพรโทคอลพร็อกซีในภาพรวมอธิบายใน พร็อกซี SOCKS เทียบกับ HTTP

พร็อกซี HTTP ทำอะไรกับคำขอเว็บ

สมมติว่าสคริปต์ติดตามร้องขอ http://example.com/catalog แทนที่จะเปิดการเชื่อมต่อเว็บไซต์โดยตรง สคริปต์เชื่อมต่อพร็อกซีที่ตั้งไว้ เมื่อใช้ HTTP/1.1 จะส่ง URL ปลายทางเต็มในคำขอ เพื่อให้พร็อกซีทราบว่าต้องติดต่อเซิร์ฟเวอร์และหน้าใด จากนั้นพร็อกซีส่งคำขอต่อและคืนคำตอบของเว็บไซต์ให้สคริปต์

ในโหมดนี้ พร็อกซีประมวลผลข้อความ HTTP จึงอ่านเมธอด เช่น GET หรือ POST ที่อยู่ที่ร้องขอ ส่วนหัว และข้อมูลที่ส่งได้ ซอฟต์แวร์ที่ตั้งไว้สำหรับหน้าที่นั้นอาจใช้กฎการเข้าถึง บันทึกคำขอ หรือแคชคำตอบที่อนุญาต การแคชเป็นฟังก์ชันเสริมที่ต้องเป็นไปตามกฎแคชของคำตอบ การซื้อการเข้าถึงพร็อกซี HTTP ไม่ได้หมายความว่าทุกหน้าจะถูกแคช

เว็บไซต์รับการเชื่อมต่อเครือข่ายจาก IP ขาออกของพร็อกซี คำว่า HTTP ไม่บอกว่า IP นั้นมาจากไหนหรือถูกจัดสรรไว้นานเท่าใด โพรโทคอลเชื่อมต่อเดียวกันอาจให้บริการด้วยที่อยู่ศูนย์ข้อมูล ISP ที่อยู่อาศัย หรือมือถือ โดยใช้ IP คงที่หรือกลุ่มหมุนเวียน

ด้านซ้าย CONNECT ระหว่างแอปกับพร็อกซี HTTP อ่านได้บนเครือข่าย ด้านขวา คำขอเดียวกันซ่อนอยู่ใน TLS ที่เชื่อมต่อพร็อกซี HTTPS เนื้อหาเว็บไซต์ HTTPS เข้ารหัสในทั้งสองกรณี

พร็อกซี HTTP เปิดเว็บไซต์ HTTPS อย่างไร

เว็บไซต์ HTTPS ใช้ TLS ปกป้องการแลกเปลี่ยนระหว่างแอปพลิเคชันกับเว็บไซต์ พร็อกซี HTTP สร้างทันเนลก่อนเพื่อส่งการแลกเปลี่ยนนั้น สำหรับคำขอไปยัง https://example.com/catalog ลำดับคือ:

สี่ขั้นตอน: CONNECT ไปยังพร็อกซี เชื่อมต่อปลายทางและยืนยันทันเนล ตรวจใบรับรอง TLS แล้วจึงรับส่งข้อมูลที่เข้ารหัส
  1. แอปพลิเคชันเชื่อมต่อพร็อกซีและขอให้เปิดทันเนลไปยัง example.com:443 โดยใช้เมธอด CONNECT คำขอระบุชื่อโฮสต์และพอร์ตปลายทาง แต่ไม่ระบุเส้นทางหน้า
  2. พร็อกซีตรวจว่าอนุญาตการเข้าถึงและปลายทางที่ร้องขอหรือไม่ รวมถึงการตรวจสอบสิทธิ์พร็อกซีที่จำเป็น จากนั้นเปิดการเชื่อมต่อปลายทางและยืนยันว่าทันเนลพร้อม
  3. แอปพลิเคชันทำ TLS handshake กับเว็บไซต์ผ่านทันเนล และตรวจใบรับรองของเว็บไซต์
  4. แอปพลิเคชันส่งคำขอเว็บอยู่ภายในการเชื่อมต่อ TLS นั้น พร็อกซีส่งต่อไบต์ที่เข้ารหัสทั้งสองทิศทาง

พร็อกซีไม่ต้องอ่านหน้าเพื่อส่งหน้าให้ แอปพลิเคชันและเว็บไซต์ยังเป็นปลายทั้งสองของการเชื่อมต่อ TLS ของเว็บไซต์ CONNECT สร้างทันเนล ส่วน TLS เข้ารหัสและป้องกันการเปลี่ยนข้อมูลโดยตรวจไม่พบ

นี่จึงเป็นเหตุผลที่พร็อกซี HTTP เปิดเว็บไซต์ HTTPS ได้ แม้ที่อยู่พร็อกซีขึ้นต้นด้วย http:// การป้องกัน HTTPS ของเว็บไซต์ทำงานอยู่ในทันเนล ไม่ได้ขึ้นอยู่กับการมี TLS ระหว่างแอปพลิเคชันกับพร็อกซี

พร็อกซี HTTPS เพิ่มอะไร

เมื่อใช้พร็อกซี HTTPS แอปพลิเคชันสร้าง TLS กับพร็อกซีและยืนยันใบรับรองของพร็อกซีก่อน จากนั้นส่งคำขอ HTTP หรือคำขอ CONNECT สำหรับทันเนลอยู่ในการเชื่อมต่อที่ป้องกันนี้ ผู้สังเกตเครือข่ายระหว่างแอปพลิเคชันกับพร็อกซีอ่านคำขอเหล่านั้นไม่ได้

สำหรับปลายทาง HTTPS แอปพลิเคชันมี TLS แยกกันสองการเชื่อมต่อ คือกับพร็อกซี และกับเว็บไซต์ผ่านทันเนล พร็อกซีแกะชั้นป้องกันภายนอกที่ส่งถึงตน แต่ข้อมูลเว็บไซต์ด้านในยังเข้ารหัส แล้วส่งไบต์เหล่านั้นต่อให้เว็บไซต์ซึ่งถอดรหัสได้ ส่วนปลายทาง HTTP ไม่มี TLS ชั้นใน จึงป้องกันเพียงการเชื่อมต่อไปยังพร็อกซี

การเชื่อมต่อไปยังพร็อกซีปลายทางส่วนใดเข้ารหัส
HTTPเว็บไซต์ HTTPทั้งสองการเชื่อมต่อไม่ใช้ TLS จึงอ่านคำขอและคำตอบได้ตามเส้นทาง
HTTPเว็บไซต์ HTTPSการแลกเปลี่ยนกับเว็บไซต์เข้ารหัสผ่านทันเนล แต่ CONNECT และการตรวจสอบสิทธิ์พร็อกซีไม่มี TLS ปกป้องบนการเชื่อมต่อไปยังพร็อกซี
HTTPSเว็บไซต์ HTTPTLS ปกป้องการเชื่อมต่อไปยังพร็อกซี พร็อกซีอ่านคำขอเว็บได้และส่งต่อไปยังเว็บไซต์ HTTP โดยไม่มี TLS
HTTPSเว็บไซต์ HTTPSTLS ปกป้องคำขอไปยังพร็อกซี และ TLS อีกชุดปกป้องการแลกเปลี่ยนกับเว็บไซต์ภายในทันเนล

การเปรียบเทียบนี้เป็นการส่งต่อพร็อกซีตามปกติที่เปิดการตรวจใบรับรอง โดยไม่มีการตรวจสอบ HTTPS แบบถอดรหัสหรือ VPN แยกต่างหาก การเข้ารหัสการเชื่อมต่อพร็อกซีไม่ได้เปลี่ยนเว็บไซต์ HTTP ให้เป็น HTTPS

พร็อกซีและเว็บไซต์มองเห็นอะไร

สำหรับปลายทาง HTTPS พร็อกซีที่ส่งต่อข้อมูลอ่านเส้นทางหน้า พารามิเตอร์คำค้น คุกกี้ ข้อมูลแบบฟอร์ม หรือเนื้อหาที่ตอบกลับภายใน TLS ไม่ได้ แต่ยังทราบ IP ไคลเอนต์ที่เชื่อมเข้ามา โฮสต์และพอร์ตปลายทางที่ขอใน CONNECT รวมทั้งเวลาและปริมาณทราฟฟิก TLS ไปยังพร็อกซีซ่อน CONNECT จากผู้สังเกตบนเครือข่ายส่วนนั้น แต่ไม่ได้ซ่อนจากพร็อกซีที่ต้องดำเนินการตามคำขอ

ข้อมูลรับรองพร็อกซีส่งแยกจากการเข้าสู่เว็บไซต์ การตรวจสอบสิทธิ์พร็อกซีแบบ Basic แปลงชื่อผู้ใช้และรหัสผ่านเป็น Base64 ซึ่งถอดกลับได้โดยไม่ต้องมีคีย์ลับ หากเชื่อมต่อพร็อกซีด้วย HTTP แบบไม่เข้ารหัส วิธีนี้ไม่ได้ปกป้องข้อมูลจากผู้สังเกตเครือข่าย HTTPS ของเว็บไซต์เริ่มภายในทันเนล จึงไม่ครอบคลุมการเข้าสู่พร็อกซีที่เกิดก่อนหน้า ส่วน TLS ไปยังพร็อกซีปกป้องข้อมูลเข้าสู่ระบบนั้นระหว่างทาง

อีกด้านหนึ่ง เว็บไซต์รับทราฟฟิกจาก IP ขาออกและอ่านคำขอที่ส่งถึงตน เว็บไซต์อาจจดจำบัญชี คุกกี้เซสชัน หรือข้อมูลอื่นที่แอปพลิเคชันส่ง การเลือกพร็อกซี HTTPS ไม่ได้ลบตัวระบุเหล่านั้นหรือทำให้เว็บไซต์ยอมรับ IP ขาออกดีขึ้นโดยอัตโนมัติ

การตรวจสอบ HTTPS แบบถอดรหัสเป็นอีกการจัดระบบหนึ่งที่ใช้ในบางเครือข่ายที่มีการจัดการและเครื่องมือแก้ข้อผิดพลาด แอปพลิเคชันเชื่อถือผู้ออกใบรับรองที่พร็อกซีตรวจสอบควบคุม จึงทำให้พร็อกซีอ่านทราฟฟิกได้ขณะคง TLS แยกทั้งสองด้าน การส่งต่อ CONNECT ตามปกติไม่ต้องติดตั้งใบรับรองเช่นนี้ การเชื่อถือใบรับรองเซิร์ฟเวอร์ของพร็อกซี HTTPS เองแยกจากการอนุญาตให้สวมเป็นเว็บไซต์

แอปสร้างคำขอ GET พร้อมคุกกี้ พร็อกซีส่งต่อเนื้อหาที่เข้ารหัสโดยไม่อ่าน และทราบโฮสต์กับพอร์ตจาก CONNECT เว็บไซต์ถอดรหัสคำขอและอ่านเส้นทางกับคุกกี้ เป็นการส่งต่อ HTTPS ตามปกติที่ไม่มีการดักถอดรหัส

วิธีอ่านการตั้งค่าการเชื่อมต่อ

การตั้งค่าพร็อกซีต้องมีที่อยู่ พอร์ต โพรโทคอลการเชื่อมต่อ และการตรวจสอบสิทธิ์ที่จำเป็น โพรโทคอลใน URL พร็อกซีใช้กับพร็อกซี ส่วนโพรโทคอลใน URL ปลายทางใช้กับเว็บไซต์

คำสั่ง curl เหล่านี้ร้องขอเว็บไซต์ HTTPS เดียวกันผ่านการเชื่อมต่อพร็อกซีสองแบบ เปลี่ยนชื่อโฮสต์และพอร์ตพร็อกซีเป็นค่าที่บริการให้สำหรับวิธีเชื่อมต่อที่เลือก:

curl --proxy http://proxy.example:8080 https://example.com/
curl --proxy https://proxy.example:8443 https://example.com/

คำสั่งแรกเชื่อมต่อพร็อกซีผ่าน HTTP แล้วสร้าง CONNECT และ TLS ไปยังเว็บไซต์ คำสั่งที่สองสร้าง TLS ไปยังพร็อกซี HTTPS ก่อน แล้วส่ง TLS แยกของเว็บไซต์ผ่านการเชื่อมต่อนั้น ในทั้งสองกรณีต้องส่งข้อมูลตรวจสอบสิทธิ์ที่บริการพร็อกซีกำหนดด้วย

การเปลี่ยน http:// เป็น https:// เพียงอย่างเดียวไม่เปลี่ยนพอร์ตที่รองรับเฉพาะ HTTP ให้เป็นจุดเชื่อมต่อ TLS หากบริการให้ชื่อโฮสต์สำหรับ HTTPS ให้ใช้ชื่อนั้น การแทนด้วย IP อาจทำให้ชื่อในใบรับรองไม่ตรงกัน

ป้ายในแอปพลิเคชันต้องอ่านอย่างระมัดระวังเช่นกัน ช่อง “HTTPS proxy” อาจเลือกพร็อกซีสำหรับเว็บไซต์ HTTPS แต่ยังเชื่อมต่อพร็อกซีด้วย HTTP ที่ไม่เข้ารหัส ใน curl ตัวแปร HTTPS_PROXY ก็เลือกพร็อกซีสำหรับปลายทาง HTTPS เช่นกัน และค่าของมันสามารถขึ้นต้นด้วย http:// ได้อย่างถูกต้อง ป้ายบอกว่าคำขอใดใช้การตั้งค่านี้ ส่วน scheme ของพร็อกซีบอกวิธีเชื่อมต่อ

DNS และทราฟฟิกที่ผ่านพร็อกซี

เมื่อไคลเอนต์ HTTP ส่งชื่อโฮสต์ปลายทาง พร็อกซีมักค้นหา IP และเชื่อมต่อให้ ส่วนไคลเอนต์ค้นหา IP แยกต่างหาก หากต้องแปลงชื่อโฮสต์ของพร็อกซีเองเพื่อเข้าถึงพร็อกซีนั้น เบราว์เซอร์อาจส่งคำถาม DNS เพื่อคาดการณ์หรือใช้กับคุณสมบัติอื่นด้วย การค้นหาเหล่านี้แยกจากกัน การตั้งค่าพร็อกซีเว็บไม่ได้ส่งคำถาม DNS ทุกครั้งผ่านพร็อกซี

การตั้งค่าใช้กับทราฟฟิกที่แอปพลิเคชันส่งไปยังพร็อกซีจริง โปรแกรมอื่นอาจยังเชื่อมตรง และรายการยกเว้นอาจข้ามพร็อกซีสำหรับบางเว็บไซต์ เช่น การกำหนดให้สคริปต์ API ผ่านพร็อกซีไม่ได้เปลี่ยนเส้นทางของเบราว์เซอร์ที่ไม่เกี่ยวข้อง ควรตรวจที่อยู่ขาออกจากแอปพลิเคชันและการตั้งค่าที่จะใช้ทำงานจริง

ไคลเอนต์ค้นหาชื่อโฮสต์ของพร็อกซี เมื่อพร็อกซีได้รับชื่อโฮสต์เว็บไซต์จึงค้นหาชื่อนั้น แอปอื่นหรือกฎข้ามพร็อกซีอาจใช้เส้นทางตรง

HTTP/2 ไปยังเว็บไซต์กับ HTTP/2 ไปยังพร็อกซี

HTTP/2 ให้การแลกเปลี่ยนหลายชุดใช้การเชื่อมต่อร่วมกันผ่านสตรีมแยก เมื่อมีพร็อกซี ต้องแยกว่าการเชื่อมต่อใดรองรับ แอปพลิเคชันอาจเจรจา HTTP/2 กับเว็บไซต์ภายในทันเนลที่สร้างด้วย HTTP/1.1 CONNECT พร็อกซีส่งต่อไบต์ที่เข้ารหัส จึงไม่ต้องเข้าใจข้อความ HTTP/2 ของเว็บไซต์

HTTP/2 ระหว่างแอปพลิเคชันกับพร็อกซีเป็นความสามารถแยกต่างหาก แต่ละทันเนล CONNECT ใช้สตรีม HTTP/2 ของตน จึงมีหลายทันเนลบนการเชื่อมต่อพร็อกซีเดียวได้ เช่น ทันเนลไปยังเว็บไซต์สองแห่งใช้การเชื่อมต่อนี้ร่วมกัน แต่ยังมีการเชื่อมต่อปลายทางและ TLS ของเว็บไซต์แยกกัน วิธีนี้ลดการเชื่อมต่อเพิ่มเติมระหว่างไคลเอนต์กับพร็อกซี ไม่ได้ทำให้พร็อกซีอ่านคำขอเว็บไซต์ที่เข้ารหัสได้

ทั้งสองด้านต้องรองรับโหมดที่เลือก HTTPS อย่างเดียวไม่ได้ระบุว่าเป็น HTTP/2 เพราะพร็อกซี HTTPS อาจใช้ HTTP/1.1 ประสิทธิภาพยังขึ้นอยู่กับไคลเอนต์ เส้นทางเครือข่าย ภาระเซิร์ฟเวอร์ และการใช้การเชื่อมต่อซ้ำ ป้าย HTTP/2 ไม่ได้รับประกันว่าทุกงานจะเร็วขึ้น

ด้านซ้าย HTTP/2 ของเว็บไซต์ทำงานภายในทันเนล TLS ที่สร้างด้วย HTTP/1.1 ด้านขวา ทันเนล CONNECT สองชุดใช้สตรีมบนการเชื่อมต่อ HTTP/2 เดียวไปยังพร็อกซี

ทันเนล CONNECT ปกติยังส่งโพรโทคอลอื่นที่ใช้ TCP ได้ หากแอปพลิเคชันและพร็อกซีอนุญาต แต่อาจมีข้อจำกัดพอร์ตปลายทาง วิธีนี้ไม่ส่งต่อ UDP ส่วน HTTP/3 ใช้ QUIC บน UDP จึงผ่านทันเนล TCP แบบเดียวกันไม่ได้ การส่งต่อ UDP ที่อาศัย HTTP ต้องใช้กลไกเพิ่มเติม เช่น CONNECT-UDP และการทำงานที่เข้ากันได้ การรองรับ HTTPS หรือ HTTP/2 เพียงอย่างเดียวไม่ได้ยืนยันความสามารถนั้น

การเข้าถึงพร็อกซี HTTP และ HTTPS มีประโยชน์ที่ใด

สำหรับการท่องเว็บและทดสอบเว็บไซต์ พร็อกซี HTTP ที่รองรับ CONNECT ให้ใช้วิธีเชื่อมต่อเดียวกับปลายทางทั้ง HTTP และ HTTPS ทีมอาจใช้ดูเว็บไซต์จากเครือข่ายพร็อกซี โดยให้เบราว์เซอร์ยังรับผิดชอบการแสดงหน้า คุกกี้ และการเข้าสู่เว็บไซต์

สำหรับครอว์เลอร์ ไคลเอนต์ API และระบบติดตามตามกำหนด ไคลเอนต์ HTTP ส่งคำขอผ่าน IP ขาออกที่เลือกได้โดยไม่เปลี่ยน URL ปลายทาง แอปพลิเคชันยังเตรียมคำขอและประมวลผลคำตอบ ภายในทันเนล HTTPS พร็อกซีส่งการแลกเปลี่ยนนั้นโดยไม่ต้องแยกอ่านทุกหน้าหรือทุกการเรียก API

พร็อกซี HTTPS ที่ป้องกันด้วย TLS มีประโยชน์เมื่อการเชื่อมต่อพร็อกซีก็ต้องได้รับการป้องกันด้วย รวมถึงข้อมูลเข้าสู่พร็อกซีและคำขอระบุปลายทาง เรื่องนี้สำคัญเมื่อผ่านเครือข่ายที่คุณควบคุมไม่ได้ ไคลเอนต์ต้องรองรับ TLS ไปยังตัวพร็อกซีเอง เพียงเปิดเว็บไซต์ HTTPS ได้ยังไม่พอ

อ่านข้อผิดพลาดการเชื่อมต่อ

ความล้มเหลวอาจเกิดตอนเข้าถึงพร็อกซี เปิดทันเนล หรือสื่อสารกับเว็บไซต์ ขั้นตอนที่เกิดปัญหาบอกได้มากกว่ารหัสข้อผิดพลาดเพียงอย่างเดียว

สิ่งที่เกิดขึ้นจุดที่ควรตรวจ
พร็อกซีตอบ 407พร็อกซีขอให้ตรวจสอบสิทธิ์ ตรวจข้อมูลรับรองหรือวิธีเข้าถึงที่กำหนด บัญชีเว็บไซต์เป็นการเข้าสู่ระบบอีกชุดหนึ่ง
HTTP ทำงาน แต่ HTTPS ไม่ทำงานตรวจว่าไคลเอนต์ใช้พร็อกซีที่คาดหมายสำหรับ HTTPS หรือไม่ อนุญาต CONNECT หรือไม่ และอนุญาตพอร์ตปลายทางหรือไม่
เกิดข้อผิดพลาด TLS หรือใบรับรองระบุว่าเกิดจากการเชื่อมต่อพร็อกซีหรือเว็บไซต์ ตรวจชื่อโฮสต์ จุดเชื่อมต่อ TLS และการเชื่อถือใบรับรองที่เกี่ยวข้อง แทนการปิดการตรวจใบรับรอง
ได้รับคำตอบ 403การปฏิเสธ CONNECT มาจากพร็อกซี ส่วน 403 ภายในการเชื่อมต่อ HTTPS ที่สร้างสำเร็จและยืนยันตามปกติเป็นคำตอบของเว็บไซต์ ทั้งสองเกิดคนละขั้นตอนและต้องแก้ต่างกัน

ทันเนลและ TLS handshake ที่สำเร็จแสดงว่าเส้นทางการเชื่อมต่อทำงาน แต่ไม่รับประกันว่าเว็บไซต์จะยอมรับบัญชี IP ขาออก หรือคำขอใด ดังนั้น การขอเข้าสู่ระบบเพิ่ม CAPTCHA หรือขีดจำกัดคำขออาจต้องแก้ที่เว็บไซต์หรือแอปพลิเคชัน แม้พร็อกซีทำงานตามปกติ

กลับไปที่ฐานความรู้