nginx como proxy reverso com SSL upstream

18

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

Os clientes (criados, pertencentes e usados ​​apenas internamente) se conectarão via SSL à caixa nginx, onde estou usando o XSendfile para validar credenciais no nível do aplicativo (um aplicativo rails). Se as credenciais forem válidas, a conexão será transmitida de volta ao 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 pergunta é quase idêntica a esta , mas com requisitos de certificado inábeis.

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

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

simonmaddox
fonte

Respostas:

19

Para quem se deparar com essa questão que deseja usar o nginx, você pode configurá-lo como qualquer proxy normal e, para aceitar um certificado autoassinado do back-end, é necessário fornecer o certificado pem exportado (e talvez uma chave) e definir a verificação SSL fora. 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 o SNI de identificação de nome de servidor com vários hosts sendo atendidos por par IP / porta, também será necessário incluir proxy_ssl_server_name on;na configuração. Isso funciona no nginx 1.7.0 e posterior.

usuário linux shonky
fonte
11
proxy_ssl_server_name on;era tudo o que eu precisava para fazer isso funcionar ao fazer proxy do tráfego para um host no Google App Engine usando seu SSL gerenciado pelo Google! (Este não é um certificado autoassinado ou algo assim, por isso só precisava dessa linha). Obrigado pela ótima dica.
XP84 9/09/18
Eu recebo 'no "ssl_certificate" está definido para a diretiva "listen ... ssl"' se eu não usar ssl_certificate. É possível proxy SSL sem fornecer o certificado upstream?
Damien
O comentário está fora do tópico, pois trata-se de proxy de conexão http para https upstream. Se você deseja proxy https, provavelmente é melhor abordar como uma pergunta separada. A resposta rápida e curta é Não, o Nginx não pode "escutar" uma porta https sem um certificado e uma chave privada.
usuário linux shonky
5

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 precisar alterar é 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.

Geléia
fonte
Pelo meu entendimento, os parâmetros ssl_certificate e ssl_certificate_key se referem à conexão do cliente , não à conexão upstream. É esse o caso?
simonmaddox
11
Pelo que entendi, sim. Neste exemplo, o certificado que o cliente vê é o fornecido pelo nginx. O nginx vê (e verifica? Não tenho certeza ...) aquele fornecido pelo servidor, mas não o transmite ao cliente.
Jam
3

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

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

simonmaddox
fonte