특정 위치에서만 클라이언트 인증서를 확인하는 Nginx 않으면 리버스 프록시 역할을합니다. 요청에

우리는 Nginx를 웹 애플리케이션 서버에 대한 리버스 프록시로 사용합니다. Nginx는 SSL을 처리하지만 그렇지 않으면 리버스 프록시 역할을합니다.

요청에 유효한 클라이언트 인증서가 /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위치를 제외한 모든 곳에서 클라이언트 인증서를 수락하지만 실제로 신경 쓰지 않습니까?



답변

두 번째 서버 블록을 대신 시도하지 않는 이유는 무엇 입니까? 코드 복제는 좋지 않지만 때로는 피할 수없는 경우가 있습니다. / 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/;
  }
}