Score:0

ส่วนหัว SNI ขาดหายไปจากไคลเอ็นต์ TLS สวัสดีเมื่อใช้พร็อกซี HTTP

ธง ar

ฉันกำลังแก้ไขข้อบกพร่องของแอปพลิเคชันที่ใช้ Java ซึ่งดึงข้อมูลเพย์โหลด JSON (รายการ CVE จาก NIST) ผ่าน HTTPS เมื่อฉันเชื่อมต่อกับ NIST โดยตรง ฉันดึงข้อมูลได้สำเร็จ เมื่อฉันใช้พร็อกซี HTTP ฉันได้รับข้อผิดพลาด TLS "ชื่อที่ไม่รู้จัก" ซึ่งบ่งชี้ถึงปัญหาเกี่ยวกับการระบุชื่อเซิร์ฟเวอร์

ฉันไม่สามารถเข้าถึงโค้ดของแอปพลิเคชัน Java และมีความสามารถน้อยที่สุดที่จะยุ่งกับการตั้งค่า JVM ดังนั้น ฉันได้ทำการทดสอบแยกต่างหากโดยใช้ openssl โดยตรง และฉันสามารถจำลองปัญหาได้ในระดับหนึ่งด้วยสิ่งนี้

เมื่อฉัน tcpdump การโทรต่อไปนี้ ฉันเห็นส่วนขยาย server_name อยู่ในแพ็กเก็ต Client Hello:

openssl s_client -connect services.nvd.nist.gov:443

Wireshark แสดงส่วนขยายชื่อเซิร์ฟเวอร์

อย่างไรก็ตาม หากฉันส่งผ่าน Squid proxy และดัมพ์แพ็กเก็ตระหว่างพร็อกซีและเซิร์ฟเวอร์เป้าหมายด้วยสิ่งต่อไปนี้ จะไม่มีส่วนขยาย server_name อยู่ในแพ็กเก็ต Client Hello:

openssl s_client -เชื่อมต่อ services.nvd.nist.gov:443 -proxy myproxy:3128

คำตอบจาก openssl คือ:

140012895368512:error:14094458:รูทีน SSL:ssl3_read_bytes:tlsv1 ชื่อที่ไม่รู้จัก:../ssl/record/rec_layer_s3.c:1543:SSL alert number 112
---
ไม่มีใบรับรองเพื่อน
---

และเราจะเห็นว่าไม่มีรายการ server_name ในแพ็คเก็ต:

WireShark แสดงส่วนขยายที่ขาดหายไป

ฉันเชื่อว่านี่คือเหตุผลที่เซิร์ฟเวอร์เป้าหมายส่งคืนข้อผิดพลาด (แม้ว่าจากสิ่งที่ฉันเข้าใจว่าควรจะส่งคืนใบรับรองเริ่มต้นในสถานการณ์นี้)

ตอนนี้ฉันสามารถทำงานได้โดยใช้พร็อกซีโดยระบุชื่อเซิร์ฟเวอร์ด้วยตนเอง:

openssl s_client -connect services.nvd.nist.gov:443 -proxy myproxy:3128 -ชื่อเซิร์ฟเวอร์ nvd.nist.gov

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

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

Steffen Ullrich avatar
se flag
ดูเหมือนว่าข้อผิดพลาดสำหรับฉันที่ `openssl s_client` ไม่ได้ส่งชื่อเซิร์ฟเวอร์ตามค่าเริ่มต้นเมื่อใช้พร็อกซี แต่ฉันสามารถสร้างปัญหาซ้ำได้ด้วย OpenSSL 1.1.1h และ 1.1.1f แต่ s_client ไม่ใช่ Java ดังนั้นฉันจะยืนยันว่าปัญหาเหล่านี้มีสาเหตุต่างกัน
Gordon Mckeown avatar
ar flag
ขอขอบคุณที่สละเวลาสร้างปัญหาอีกครั้ง @SteffenUllrich เห็นด้วย พวกเขาอาจมีสาเหตุที่แตกต่างกัน ดูเหมือนเป็นเรื่องบังเอิญที่ทั้งคู่ดูเหมือนจะแสดงพฤติกรรมเดียวกัน ดังนั้นฉันจึงสงสัยว่ามีบางอย่างเกี่ยวกับการใช้พร็อกซีที่กำหนดพฤติกรรม TLS ที่แตกต่างกันหรือไม่ นอกจากนี้ยังง่ายกว่ามากในการทดสอบและอธิบายปัญหาโดยใช้ openssl :) ฉันได้เปิด [bug](https://github.com/openssl/openssl/issues/17232) กับ openssl แล้ว

โพสต์คำตอบ

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