우리는 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/;
}
}