O fluxo nginx pode funcionar com vários certificados SSL?

1

Estou tentando configurar o nginx como um front-end para o IIS 7, para que eu possa configurar vários certificados SSL com um único IP, algo que o IIS não suporta (chocante).

Do jeito que eu vejo, eu não preciso nem deveria estar interferindo na camada HTTP, ou em qualquer dado não criptografado. Eu deveria configurar o nginx para lidar apenas com a camada SSL. Felizmente, isso ajuda a fazer isso!

Mas não com vários certificados, aparentemente?

Basicamente é isso que estou tentando:

stream {
    upstream http_backend {
        server 192.168.1.1:80;
    }

    upstream https_backend {
        server 192.168.1.1:443;
    }

    server {
        listen 80;
        proxy_pass http_backend;
    }

    server {
        listen 443 ssl;

        ssl_certificate      certs/default.pem;
        ssl_certificate_key  certs/default.key;

        ssl_certificate      certs/domain1.pem;
        ssl_certificate_key  certs/domain1.key;

        ssl_certificate      certs/domain2.pem;
        ssl_certificate_key  certs/domain2.key;

        proxy_pass https_backend;
        proxy_ssl on;
    }
}

De acordo com a documentação , ssl_certificate e ssl_certificate_key podem ser chamados várias vezes, mas com a finalidade de especificar certificados de tipos diferentes, não para domínios diferentes. Nesse caso, o último par simplesmente substitui os anteriores e se torna o único certificado com o qual você negocia ao tentar acessar o servidor, independentemente do nome do host usado.

No modo stream não consigo configurar várias entradas server na mesma porta apenas alterando server_name , como posso no modo http , de fato server não suporta server_name quando usado no contexto stream , então não está claro como devo resolver isso.

Estou pesquisando o dia todo e não consigo encontrar uma solução. Talvez o nginx simplesmente não suporte o que eu preciso? E, nesse caso, existe uma alternativa?

Qualquer conselho apreciado!

    
por Havenard 16.07.2018 / 01:44

1 resposta

0

Então eu tive uma epifania e consegui resolver esse problema.

Acontece que você não precisa configurar o modo SSL ou qualquer certificado no fluxo server entry para que o ssl_preread funcione, e isso possibilita uma solução interessante.

Eu posso configurar várias entradas server em portas arbitrárias listadas para localhost , cada uma com um certificado diferente, e ter uma% principal server na porta 443 roteando as conexões de entrada para a correta.

Aqui está uma configuração básica com 3 certificados:

worker_processes  1;

events {
}

stream {

    // IIS server
    upstream https_backend {
        server 10.0.0.1:443;
    }

    // set up SSL session with the default certificate
    upstream default {
        server 127.0.0.1:4430;
    }
    server {
        listen 127.0.0.1:4430 ssl;

        ssl_certificate certs/default.pem;
        ssl_certificate_key certs/default.key;

        proxy_ssl on;
        proxy_pass https_backend;
    }

    // set up SSL session with certificate for marvel.com, www.marvel.com
    upstream marvel {
        server 127.0.0.1:4431;
    }
    server {
        listen 127.0.0.1:4431 ssl;

        ssl_certificate certs/marvel.pem;
        ssl_certificate_key certs/marvel.key;

        proxy_ssl on;
        proxy_pass https_backend;
    }

    // set up SSL session with certificate for dccomics.com, www.dccomics.com
    upstream dccomics {
        server 127.0.0.1:4432;
    }
    server {
        listen 127.0.0.1:4432 ssl;

        ssl_certificate certs/dccomics.pem;
        ssl_certificate_key certs/dccomics.key;

        proxy_ssl on;
        proxy_pass https_backend;
    }

    // route connection to the tunnel with correct certificate
    map $ssl_preread_server_name $upstream {
        marvel.com marvel;
        www.marvel.com marvel;

        dccomics.com dccomics;
        www.dccomics.com dccomics;

        default default;
    }
    server {
        listen 443;
        ssl_preread on;
        proxy_pass $upstream;
    }
}

Portanto, no que diz respeito à autenticação SSL e NTLM, esta é uma maravilha, mas a única coisa que falta nesta configuração é a possibilidade de registar o IP do utilizador real nos registos do IIS, uma vez que não consigo definir X-Forwarded-For nos cabeçalhos HTTP.

    
por 09.09.2018 / 21:46