ฉันพยายามทำความเข้าใจวิธีการทำงานของ TLS ให้ดียิ่งขึ้น ฉันเข้าใจว่าในกรณีการใช้งานปกติ คุณต้องมีการสร้างค่าสุ่มต่างๆ และใช้ในการแลกเปลี่ยนคีย์ เพื่อป้องกันไม่ให้ MITM บางตัวใช้การส่งก่อนหน้าซ้ำเพื่อปลอมแปลงเซิร์ฟเวอร์หรือไคลเอนต์
อย่างไรก็ตาม ให้เราสมมติกรณีเสื่อมโทรมที่มีเซิร์ฟเวอร์เครื่องเดียวซึ่งมีรหัสสาธารณะเดียวที่ลูกค้ารู้จักและฝ่ายตรงข้ามหลายคนรู้จักอยู่แล้ว ในกรณีนี้ ฉันคิดว่าสิ่งที่พูดอย่างเคร่งครัดที่จำเป็นในการแลกเปลี่ยนคีย์ที่ปลอดภัยจะเป็นดังนี้:
- ลูกค้าใช้คีย์ RSA สาธารณะของเซิร์ฟเวอร์เพื่อเข้ารหัสคีย์เซสชันสมมาตรแบบสุ่ม
- ลูกค้าส่งคีย์เซสชันที่เข้ารหัสของเซิร์ฟเวอร์
- เซิร์ฟเวอร์ถอดรหัสคีย์เซสชันโดยใช้คีย์ RSA ส่วนตัวของเซิร์ฟเวอร์
- เซิร์ฟเวอร์ใช้คีย์เซสชันเพื่อเข้ารหัสข้อความ "เสร็จสิ้น"
- เซิร์ฟเวอร์ส่งข้อความ "เสร็จสิ้น" ที่เข้ารหัสไคลเอนต์
- ลูกค้าใช้คีย์เซสชันเพื่อถอดรหัสข้อความ "เสร็จสิ้น"
- ลูกค้ายืนยันว่าข้อความ "เสร็จสิ้น" การจับมือกันเสร็จสมบูรณ์
ดังนั้นในกระบวนการที่เรียบง่ายนี้ ค่าเดียวที่เปลี่ยนแปลงแต่ละเซสชันคือคีย์เซสชันเอง ดังนั้นจึงไม่มีการใช้ไคลเอ็นต์หรือเซิร์ฟเวอร์สุ่มก่อนหน้านี้ และไม่มีความลับของพรีมาสเตอร์ มีเพียงคีย์เซสชันเท่านั้น
สิ่งนี้รู้สึกเหมือนเป็นการทำให้สิ่งต่าง ๆ ง่ายขึ้นอย่างมาก แต่ฉันมีปัญหาในการดูสิ่งที่ฉันขาดหายไป หากจุดประสงค์หลักของการแลกเปลี่ยนคีย์คือเพื่อให้แน่ใจว่าเซิร์ฟเวอร์เป็นเซิร์ฟเวอร์เดียวที่ได้รับคีย์เซสชัน การดำเนินการนี้ดูเหมือนจะปลอดภัย พิสูจน์ด้วยความขัดแย้ง ติดตามกระบวนการข้างต้นอีกครั้ง แต่จากมุมมองของฝ่ายตรงข้าม:
- ฝ่ายตรงข้ามมีคีย์สาธารณะของเซิร์ฟเวอร์อยู่แล้ว สามารถเข้ารหัสคีย์เซสชันแบบสมมาตรของตัวเองเพื่อจุดประสงค์ MITM
- ฝ่ายตรงข้ามสามารถเห็นคีย์เซสชันที่เข้ารหัสจากลูกค้า แต่ไม่สามารถถอดรหัสได้ สามารถส่งคีย์เซสชัน MITM ที่เข้ารหัสของตัวเองให้เซิร์ฟเวอร์ได้
- เซิร์ฟเวอร์ถอดรหัสคีย์เซสชัน MITM โดยไม่ทราบที่มา
- เซิร์ฟเวอร์ใช้คีย์เซสชัน MITM เพื่อเข้ารหัส "เสร็จสิ้น"
- เซิร์ฟเวอร์ส่งไคลเอนต์ (ในความเป็นจริงเป็นปฏิปักษ์) เข้ารหัส "เสร็จสิ้น"
- ฝ่ายตรงข้ามสามารถถอดรหัส "เสร็จสิ้น" แต่ไม่สามารถเข้ารหัสซ้ำและส่งไปยังไคลเอ็นต์ด้วยคีย์เซสชันของไคลเอนต์ ซึ่งฝ่ายตรงข้ามไม่สามารถถอดรหัสได้
- ในที่สุดไคลเอนต์จะไม่ได้รับการเข้ารหัสที่ถูกต้อง "เสร็จสิ้น" ไม่ว่าจะจากเซิร์ฟเวอร์หรือฝ่ายตรงข้าม
ดังนั้น ดูเหมือนว่าจุดอ่อนเดียวที่อาจเกิดขึ้นในที่นี้คือเซิร์ฟเวอร์ไม่มีทางรู้ว่ากำลังสื่อสารกับไคลเอนต์ที่ถูกต้องหรือเป็นศัตรู - แต่อย่างที่ฉันเข้าใจ การตรวจสอบสิทธิ์ไคลเอนต์นั้นไม่เคยอยู่ในมุมมองที่จะเริ่มต้น การรับรองความถูกต้องของเซิร์ฟเวอร์นั้นไม่ใช่เรื่องที่ต้องกังวลเนื่องจากมีเพียงเซิร์ฟเวอร์เดียวเท่านั้น
ฉันเข้าใจถูกต้องหรือไม่ว่าหากมีใครใช้แผนนี้ ศัตรูจะทำการโจมตีแบบ MITM เป็นไปไม่ได้ หรือสิ่งนี้จะพ่ายแพ้ได้อย่างไร?