Nginx chỉ xác minh certs khách hàng trên một vị trí cụ thể


13

Chúng tôi sử dụng Nginx làm proxy ngược cho máy chủ ứng dụng web của mình. Nginx xử lý SSL của chúng tôi và như vậy nhưng mặt khác chỉ hoạt động như một proxy ngược.

Chúng tôi muốn yêu cầu chứng chỉ ứng dụng khách hợp lệ cho các yêu cầu /jsonrpcnhưng không yêu cầu chúng ở bất kỳ nơi nào khác. Cách tốt nhất chúng tôi tìm thấy là

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/;
  }
}

Điều này hoạt động tốt đối với hầu hết các trình duyệt, nhưng một số trình duyệt như Safari và Chrome trên Android cuối cùng sẽ nhắc người dùng cung cấp chứng chỉ ứng dụng khách bất kể họ đi đâu trên trang web.

Làm thế nào để chúng tôi khiến Nginx chấp nhận nhưng không thực sự quan tâm đến chứng chỉ khách hàng ở mọi nơi ngoại trừ /jsonrpcvị trí của chúng tôi ?

Câu trả lời:


7

Tại sao không thử khối máy chủ thứ hai thay thế? Sao chép mã là xấu nhưng đôi khi không thể tránh khỏi. Tôi giả sử / jsonrpc đại diện cho một API để nó có thể sử dụng tên miền phụ của chính nó nếu chưa sử dụng nó:

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/;
  }
}

Đây là những gì chúng ta có thể sẽ làm nếu chúng ta không thể tìm ra cách đặt tất cả cấu hình đúng trong cùng một serverkhối. Chúng tôi chưa gặp vấn đề tương tự khi sử dụng Apache, vì vậy tôi hy vọng có một số cài đặt sẽ hoạt động ở đây.
Eli Courtwright

1
@EliCourtwright Tôi biết câu hỏi này đã có từ lâu, nhưng bạn đã bao giờ tìm thấy một giải pháp tốt hơn hai khối máy chủ chưa?
N Jones

2
@NJones: tiếc là không, đó là những gì chúng tôi phải đi cùng.
Eli Courtwright
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.