Nginx การตรวจสอบไคลเอ็นต์ certs เฉพาะตำแหน่งที่ระบุเท่านั้น


14

เราใช้ Nginx เป็น reverse proxy ไปยังเว็บแอพพลิเคชันเซิร์ฟเวอร์ของเรา Nginx จัดการ SSL ของเราและเช่นนั้นทำหน้าที่เป็น reverse proxy

เราต้องการใบรับรองลูกค้าที่ถูกต้องสำหรับคำขอ/jsonrpcแต่ไม่ต้องการที่อื่น วิธีที่ดีที่สุดที่เราพบคือ

server {
  listen       *:443 ssl;

  ssl on;
  ssl_certificate         /etc/nginx/server.crt;
  ssl_certificate_key     /etc/nginx/server.key;
  ssl_client_certificate  /etc/nginx/client-ca.crt;

  ssl_verify_client optional;

  location /jsonrpc {
    if ($ssl_client_verify != "SUCCESS") { return 403; }

    proxy_pass          http://localhost:8282/jsonrpc-api;
    proxy_read_timeout  90;
    proxy_redirect      http://localhost/ $scheme://$host:$server_port/;
  }
}

สิ่งนี้ใช้ได้ดีกับเบราว์เซอร์ส่วนใหญ่ แต่เบราว์เซอร์บางตัวเช่น Safari และ Chrome-on-Android จะแจ้งให้ผู้ใช้ระบุใบรับรองลูกค้าไม่ว่าจะไปที่ใดบนเว็บไซต์

เราจะทำให้ Nginx ยอมรับ แต่ไม่สนใจเกี่ยวกับใบรับรองลูกค้าได้ทุกที่ยกเว้น/jsonrpcที่ตั้งของเรา

คำตอบ:


8

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

server {
  listen       *:443 ssl;
  server_name api.example.com;

  ssl on;
  ssl_certificate         /etc/nginx/server.crt;
  ssl_certificate_key     /etc/nginx/server.key;
  ssl_client_certificate  /etc/nginx/client-ca.crt;

  ssl_verify_client on;

  location =/jsonrpc {
    proxy_pass          http://localhost:8282/jsonrpc-api;
    proxy_read_timeout  90;
    proxy_redirect      http://localhost/ $scheme://$host:$server_port/;
  }
}

server {
  listen       *:443 ssl;

  ssl on;
  ssl_certificate         /etc/nginx/server.crt;
  ssl_certificate_key     /etc/nginx/server.key;
  ssl_client_certificate  /etc/nginx/client-ca.crt;

  ssl_verify_client off;

  location / {
    proxy_pass          http://localhost:8282/;
    proxy_read_timeout  90;
    proxy_redirect      http://localhost/ $scheme://$host:$server_port/;
  }
}

นี่คือสิ่งที่เราอาจจะทำหากเราไม่สามารถหาวิธีที่จะทำให้การกำหนดค่าที่เหมาะสมทั้งหมดอยู่ในserverบล็อกเดียวกัน เราไม่ได้มีปัญหาเดียวกันนี้เมื่อใช้ Apache ดังนั้นฉันหวังว่าจะมีการตั้งค่าบางอย่างที่จะใช้งานได้ที่นี่
Eli Courtwright

1
@EliCourtwright ฉันรู้ว่าคำถามนี้นานมาแล้ว แต่คุณเคยพบทางออกที่ดีกว่าสองเซิร์ฟเวอร์บล็อกหรือไม่
N Jones

2
@Nones: โชคไม่ดีนั่นคือสิ่งที่เราต้องไปด้วย
Eli Courtwright

ถ้าทุกอย่างต้องตอบสำหรับโดเมนเดียวกัน www.example.com วิธีการเช่นนี้ยังคงใช้ได้หรือไม่
Freedom_Ben
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.