Múltiplo SSL no NGINX com configurações compartilhadas?

1

Eu tenho um servidor de desenvolvimento NGINX. Eu tenho um grande número de diretivas de configuração que direcionam vários recursos do servidor.

Eu quero poder acessar o servidor via SSL. O problema é que eu posso acessar o servidor de diferentes nomes de domínio. Por exemplo, dentro da minha LAN eu poderia usar 192.168.1.100, mas na Internet (através do encaminhamento de NAT) eu usaria o nome de domínio da minha casa, ou em algumas instâncias específicas o endereço IP externo do servidor.

Como o SSL depende do nome do host que o cliente solicitou, desejo gerar e fornecer vários certificados SSL com base em como o servidor está sendo acessado. Por exemplo, o CN de um certificado seria " link ", enquanto outro seria " link "e outro ainda pode ser" link ".

Acho que é possível conseguir isso duplicando blocos de servidores como este:

server {
    listen 443 ssl;
    server_name 192.168.1.10;
    ssl_certificate /etc/nginx/192.168.1.10.crt;
    ssl_certificate_key /etc/nginx/192.168.1.10.pem;
    location / {
        root   /var/www/root;
        index  index.html index.htm;
    }
}
server {
    listen 443 ssl;
    server_name www.example.com;
    ssl_certificate /etc/nginx/www.example.com.crt;
    ssl_certificate_key /etc/nginx/www.example.com.pem;
    location / {
        root   /var/www/root;
        index  index.html index.htm;
    }
}
...

O problema é que tenho vários (ou seja, mais de 10)% blocoslocation dentro da configuração do meu servidor porque estou testando várias configurações, ambientes e aplicativos da Web no mesmo servidor. A maioria desses locais inclui uma passagem FastCGI e / ou uma diretiva alias ou rewrite .

A duplicação de todos os blocos location não é apenas tediosa, mas pode levar a inconsistências se eu esquecer de atualizar cada uma delas.

Além disso, também planejei possivelmente usar esse ambiente no futuro, de forma a usar subdomínios, cada um com blocos de localização diferentes. Então agora acabamos com algo assim:

  • www.example.com usa o conjunto de parâmetros location 1
  • 12.34.56.78 usa o conjunto de parâmetros location 1
  • test.example.com usa o conjunto de parâmetros location 2
  • 192.168.1.100 usa o conjunto de parâmetros location 2

Desde que eu não use SSL, isso não é um problema, já que o servidor sempre será servido do bloco de servidores "padrão". Mas o SSL parece exigir um bloco server separado para cada nome de domínio para servir os certificados exclusivos ...

Idealmente, o que eu gostaria é de algum tipo de "agrupamento / inclusão nomeada" onde eu pudesse escrever todos os location blocos em uma seção separada e então incluí-los dentro de server blocos. Minha solução "ideal" se existisse:

config config1 {
    location / {
        root   /var/www/root;
        index  index.html index.htm;
    }
    location /testapp1 {
        include fastcgi_params;
        fastcgi_split_path_info ^(/testapp1)(.*)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_pass unix:/run/testapp1.sock;
    }
}
config config2 {
    location / {
        root   /var/www/root2;
        index  index.html index.htm;
    }
    location /testapp2 {
        include fastcgi_params;
        fastcgi_split_path_info ^(/testapp2)(.*)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_pass unix:/run/testapp2.sock;
    }
}

server {
    listen 443 ssl;
    server_name 192.168.1.100;
    ssl_certificate /etc/nginx/192.168.1.10.crt;
    ssl_certificate_key /etc/nginx/192.168.1.10.pem;
    include config config1;
}
server {
    listen 443 ssl;
    server_name www.example.com;
    ssl_certificate /etc/nginx/www.example.com.crt;
    ssl_certificate_key /etc/nginx/www.example.com.pem;
    include config config1;
}
server {
    listen 443 ssl;
    server_name test.example.com;
    ssl_certificate /etc/nginx/test.example.com.crt;
    ssl_certificate_key /etc/nginx/test.example.com.pem;
    include config config2;
}
...
    
por fdmillion 23.06.2015 / 21:09

2 respostas

2

Como as diretivas SSL só estão disponíveis em server ou http contextts, não é possível contornar a necessidade de escrever um bloco por certificado.

Você pode, no entanto, mover o conteúdo, que é sempre o mesmo (?), para um arquivo diferente. Este arquivo seria então include d em cada bloco. Então, isso é quase como sua solução imaginada.

Você também pode querer considerar o uso de certificados válidos para vários assuntos, usando o campo Nome alternativo do assunto. Quando vai comercial, isso é muito caro, embora.

    
por 23.06.2015 / 21:11
0

Eu usaria um certificado de vários domínios usando Nomes Alternativos de Assunto. Você só precisa de um bloco de servidor para todos os seus vários nomes de host. Eu frequentemente os crio com uma especificação de host curinga (* .domain.com) além de qualquer outro domínio que eu exija. Isso torna fácil usar o mesmo certificado para www.domain.com, dev1.domain.com, staging.domain.com etc.

Embora para um propósito diferente, esta questão tem o procedimento:

Como criar um certificado SSL autoassinado com nomes alternativos de assunto (SAN) para sites do IIS

    
por 23.06.2015 / 21:20

Tags