nginx como proxy reverso com SSL upstream

12

Estou criando um proxy para uma API interna para permitir que os clientes se conectem sem a necessidade de ter os certificados autoassinados instalados.

Os clientes (criados, de propriedade e usados somente internamente) se conectarão via SSL à caixa nginx, onde eu estou usando o XSendfile para validar as credenciais no nível do aplicativo (um aplicativo rails). Se as credenciais forem válidas, a conexão é passada de volta para nginx, onde usa proxy_pass para enviar a conexão ao servidor upstream.

Agora isso funciona muito bem para conexões http padrão, mas estou tentando descobrir como adicionar nossos certificados ao mix.

Esta questão é quase idêntica a este , mas com requisitos de certificado desajeitados.

Isso é possível com o nginx? Existe uma solução melhor?

Eu também me contentaria com http do cliente - > nginx e certificado autoassinado do nginx para a API.

    
por simonmaddox 14.12.2011 / 21:50

3 respostas

2

Para quem se deparar com isso no futuro, acabei não usando o nginx para isso.

Em vez disso, acabei usando stunnel em "modo cliente". Muito fácil de configurar e faz exatamente o que eu preciso.

    
por 05.01.2012 / 18:17
14

Para qualquer um que tropeçar nessa questão que deseja usar o nginx, você pode configurá-lo como qualquer proxy normal e aceitar um certificado autoassinado do back-end. É necessário fornecer o certificado pem exportado (e talvez uma chave) e defina a verificação SSL. Por exemplo:

...

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
    }

Se o seu back end seguro estiver usando a SNI de identificação do nome do servidor, com vários hosts sendo veiculados por par IP / porta, talvez seja necessário incluir proxy_ssl_server_name on; na configuração. Isso funciona no nginx 1.7.0 e posterior.

    
por 31.08.2015 / 08:32
4

Eu acho que você provavelmente quer algo assim (obviamente simplificado para este exemplo):

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

A única coisa que você pode ter que alterar seria tornar o "Host" explícito - se, por exemplo, o nome do host com proxy não for o mesmo que o nome do host usado no servidor proxy nginx.

    
por 14.12.2011 / 22:28