업스트림 SSL을 사용하는 리버스 프록시 인 nginx


18

클라이언트가 자체 서명 된 인증서를 설치할 필요없이 연결할 수 있도록 내부 API에 대한 프록시를 작성 중입니다.

클라이언트 (빌드, 소유 및 내부에서만 사용)는 SSL을 통해 nginx 상자에 연결되며 XSendfile 을 사용 하여 응용 프로그램 수준 (레일 앱)에서 자격 증명을 확인합니다. 자격 증명이 유효하면 연결이 nginx로 다시 전달되며 여기서 proxy_pass를 사용하여 업스트림 서버로 연결을 보냅니다.

이제 이것은 표준 http 연결에 효과적이지만 인증서를 믹스에 추가하는 방법을 알아 내려고합니다.

이 질문은 거의 동일 이 하나 ,하지만 어색 인증서 요구 사항.

nginx에서도 가능합니까? 더 나은 해결책이 있습니까?

또한 클라이언트-> nginx에서 http를 설정하고 nginx에서 API로 자체 서명 된 인증서를 설정했습니다.

답변:


19

nginx를 사용하려는이 질문에 걸려 넘어지는 사람은 일반 프록시처럼 이것을 설정하고 백엔드에서 자체 서명 된 인증서를 수락하려면 내 보낸 pem 인증서 (및 키)를 제공하고 SSL 확인을 설정해야합니다 떨어져서. 예를 들면 다음과 같습니다.

...

server {
    listen       10.1.2.3:80;
    server_name  10.1.2.3 myproxy.mycompany.com;

    location / {
         proxy_pass                    https://backend.server.ip/;
         proxy_ssl_trusted_certificate /etc/nginx/sslcerts/backend.server.pem;
         proxy_ssl_verify              off;

         ... other proxy settings
    }

보안 백엔드가 IP / 포트 쌍마다 여러 호스트가 제공되는 서버 이름 식별 SNI를 사용하는 proxy_ssl_server_name on;경우 구성 에 포함해야 할 수도 있습니다 . 이것은 nginx 1.7.0 이상에서 작동합니다.


1
proxy_ssl_server_name on;기본 제공 Google 관리 SSL을 사용하여 Google App Engine의 호스트로 트래픽을 프록시 처리 할 때이 작업을 수행하는 데 필요한 전부였습니다! (이것은 자체 서명 된 인증서 또는 다른 것이 아니므로 한 줄만 필요했습니다). 좋은 팁 주셔서 감사합니다.
XP84

ssl_certificate를 사용하지 않으면 "listen ... ssl"지시문에 대해 "ssl_certificate"가 정의되지 않습니다. 업스트림 인증서를 제공하지 않고 SSL을 프록시 할 수 있습니까?
Damien

이것이 업스트림 https에 연결하는 http 프록시에 관한 것이므로 주석이 아닙니다. https를 프록시하려면 별도의 질문으로 해결하는 것이 좋습니다. 빠르고 간단한 대답은 No Nginx가 인증서와 개인 키없이 https 포트를 "듣지"못한다는 것입니다.
shonky linux user

5

나는 당신이 아마 이런 것을 원한다고 생각합니다 (이 예제에서는 분명히 단순화되었습니다).

worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    upstream backend {
        server mybackendserver:443;
    }

    server {
        server_name localhost;
        listen 443 ssl;
        ssl_certificate /etc/nginx/server.crt;
        ssl_certificate_key /etc/nginx/server.key;
        ssl_verify_client off;
        location / {
            proxy_pass  https://backend;
            proxy_set_header Host $http_host;
            proxy_set_header X_FORWARDED_PROTO https;
        }
    }
}

예를 들어 프록시 된 호스트 이름이 nginx 프록시 서버에서 사용 된 호스트 이름과 같지 않은 경우 "Host"를 명시 적으로 변경해야합니다.


내 이해에서 ssl_certificate 및 ssl_certificate_key 매개 변수 는 업스트림 연결이 아니라 클라이언트 연결을 나타냅니다. 그 경우입니까?
simonmaddox

1
내가 이해 한 것에서 그렇습니다. 이 예제에서 클라이언트가 보는 인증서는 nginx에서 제공 한 인증서입니다. nginx는 서버가 제공하는 것을보고 (확인하지만 확실하지 않습니다 ...) 클라이언트에게 전달하지 않습니다.
Jam

3

앞으로이 문제를 겪는 사람에게는 nginx를 사용하지 않았습니다.

대신 "클라이언트 모드"에서 stunnel을 사용했습니다. 설정이 매우 쉽고 필요한 것을 정확하게 수행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.