tldr
ด้วย mTLS ฉันกำลังพยายามหาวิธีออกใบรับรองไคลเอ็นต์ที่อนุญาตให้ไคลเอนต์นั้นเข้าถึงโดเมนย่อยที่ระบุเท่านั้น ฉันสงสัยว่ามันเป็นไปไม่ได้ แต่ฉันไม่แน่ใจ
สิ่งที่ฉันพยายามทำให้สำเร็จ
สมมติว่าฉันมีเซิร์ฟเวอร์ที่ฟังสิ่งที่กำหนดเส้นทางไป *.foo.flar.com
ลูกค้าแต่ละรายได้รับการกำหนดโดเมนย่อยของตนเองซึ่งตรงตามไวลด์การ์ดในที่อยู่ของเซิร์ฟเวอร์
ตัวอย่างเช่น, ลูกค้า1
ควรเข้าถึงเซิร์ฟเวอร์ผ่านทาง ลูกค้า1.foo.flar.com
, และ ลูกค้า2
ควรเข้าถึงเซิร์ฟเวอร์ผ่านทาง customer2.foo.flar.com
.
นอกจากนี้ ลูกค้ารายหนึ่งต้องถูกป้องกันไม่ให้เข้าถึงเซิร์ฟเวอร์โดยใช้โดเมนย่อยของลูกค้ารายอื่น ดังนั้นจึงผิดกฎหมายสำหรับ ลูกค้า1
การร้องขอ customer2.foo.flar.com
และควรปฏิเสธคำขอดังกล่าว
ฉันหวังว่าฉันจะทำสิ่งนี้ได้สำเร็จที่เลเยอร์เซสชันผ่าน mTLS และการใช้ใบรับรอง SAN ที่ชาญฉลาด แต่ฉันมีปัญหาในการทำให้มันทำงานได้อย่างถูกต้อง
ฉันมีการตั้งค่าสิ่งต่าง ๆ อย่างไร
ฉันค่อนข้างใหม่ในการเล่น TLS ดังนั้นสิ่งนี้จึงมาจากหลายสิ่งหลายอย่าง คำตอบ SO นี้เกี่ยวกับการกำหนดค่า SAN และ บทความนี้เกี่ยวกับการกำหนดค่า mTLS พื้นฐาน.
ฉันได้ละเว้นบางสิ่งที่นี่ เช่น การสร้างใบรับรอง CA และไคลเอนต์และการสร้าง CSR ของไคลเอ็นต์และเซิร์ฟเวอร์ เพื่อพยายามโฟกัสสิ่งต่างๆ แต่สามารถเพิ่มได้หากต้องการ
ฉันสร้างใบรับรองเซิร์ฟเวอร์โดยใช้สิ่งที่ต้องการ:
opensl x509 \
-req \
-extfile <(printf "subjectAltName=DNS:*.foo.flar.com") \
-วัน 365 \
-ในเซิร์ฟเวอร์.csr \
-CA ca.crt \
-CAkey ca.key \
-CAcreateserial \
-ออก server.crt
จากนั้นฉันสร้างใบรับรองไคลเอนต์โดยใช้สิ่งต่อไปนี้:
opensl x509 \
-req \
-extfile <(printf "subjectAltName=DNS:customer1.foo.flar.com") \
-วัน 365 \
-ใน client.csr \
-CA ca.crt \
-CAkey ca.key \
-CAcreateserial \
-ออก client.crt
เซิร์ฟเวอร์ (เขียนว่า Go) ได้รับการกำหนดค่าให้ต้องการและตรวจสอบใบรับรองไคลเอ็นต์
ปัญหา
ปัญหาคือเมื่อฉันทดสอบการตั้งค่านี้ การเชื่อมต่อจะสำเร็จทั้งที่ฉันคาดว่าจะล้มเหลว
ถ้าฉันมีลูกค้าออก ลูกค้า1
รับรองเรียกเซิร์ฟเวอร์ที่ ลูกค้า1.foo.flar.com
การเชื่อมต่อสำเร็จ
อย่างไรก็ตามหากฉันมีลูกค้าออก ลูกค้า1
รับรองเรียกเซิร์ฟเวอร์ที่ customer2.foo.flar.com
การเชื่อมต่อนั้นสำเร็จเมื่อฉันคาดว่าจะล้มเหลว
ฉันหวังว่าเมื่อตรวจสอบใบรับรองของลูกค้าแล้ว เซิร์ฟเวอร์จะเห็นสิ่งนั้น ลูกค้า1
ไม่สามารถเข้าถึง ลูกค้า2...
และจะปฏิเสธคำขอ แต่สิ่งนี้ดูเหมือนจะไม่เกิดขึ้น
ไอเดีย?