ฉันใช้ nginx เพื่อเพิ่มฟังก์ชัน TLS ที่ด้านบนของเซิร์ฟเวอร์ TCP (Redis) ที่มีอยู่โดยการมอบฉันทะ (โปรดอ่านก่อนที่จะพูดว่า "Redis มีการสนับสนุน TLS ในตัว"):
ลำธาร {
เซิร์ฟเวอร์ {
ฟัง 6379 ssl;
ssl_certificate /etc/ssl/private/tls.crt;
ssl_certificate_key /etc/ssl/private/tls.key;
ssl_client_certificate /etc/ssl/private/ca.crt;
เปิด ssl_verify_client;
proxy_pass redis:679;
}
}
อย่างไรก็ตามสิ่งนี้จะยอมรับ ทั้งหมด ใบรับรองไคลเอนต์ที่ลงนามโดย CA ที่ระบุ ฉันต้องการยอมรับเฉพาะใบรับรองไคลเอนต์ที่มี CN เฉพาะ: cn=api
. เมื่อพร็อกซี HTTP ฉันสามารถใช้ไฟล์ ถ้า
คำสั่งเช่นนี้
ถ้า ($ssl_client_s_dn != "CN=api") {
กลับ 403;
}
อย่างไรก็ตามดูเหมือนว่า ถ้า
คำสั่งเช่นนั้นไม่ได้รับอนุญาตในเซิร์ฟเวอร์สตรีม เป็นวิธีแก้ปัญหาที่ฉันใช้ a แผนที่
คำสั่งไปยังคำขอกำหนดเส้นทางที่ไม่ตรงกับ CN ไปยังอัปสตรีมที่ไม่มีอยู่ดังนี้:
ลำธาร {
ต้นน้ำ redis_backend {
เซิร์ฟเวอร์ redis:6379;
}
แผนที่ $ssl_client_s_dn $backend_svr {
"CN=api" redis_backend;
ค่าว่างเริ่มต้น;
}
เซิร์ฟเวอร์ {
...
proxy_pass $backend_svr;
}
}
อย่างไรก็ตาม ฉันอดไม่ได้ที่จะรู้สึกว่าต้องมีวิธีที่ดีกว่าในการปฏิเสธการเชื่อมต่อสำหรับใบรับรองไคลเอ็นต์ที่ไม่ตรงกัน