Como servir vários certificados SSL para o host virtual padrão no NGINX?

3

Eu tenho um aplicativo estático no Amazon S3 que é servido por meio de um proxy NGINX. A finalidade que uso um proxy é permitir que os usuários apontem seus domínios para minha instância do Amazon EC2 (por meio do registro CNAME apontando para custom-domain.myproduct.com ) para que eles possam acessar meu aplicativo por meio de seu próprio URL personalizado, como este: myproduct.happyclient.com .

Para conseguir isso, eu tenho a seguinte configuração nginx (partes removidas por brevidade):

http {
    server {
    # This is my default route. References:
    # http://stackoverflow.com/a/15799883/91403
    # http://nginx.org/en/docs/http/request_processing.html

    listen 80 default_server;
    server_name custom-domain.myproduct.com;
    location / {
        proxy_pass http://static.myproduct.com; # points to Amazon S3
        proxy_set_header Host myproduct.com;
    }
}

Mesmo que meu aplicativo estático seja 100% público (sem segredo de cliente, apenas html e javascript), alguns dos meus clientes desejam acessá-lo por SSL. Como posso escolher dinamicamente qual certificado usar para a conexão SSL com base no cabeçalho do host? Note que não posso simplesmente codificar o caminho do certificado.

PS .: os clientes poderão enviar seus certificados para minha instância PS2 .: essa configuração já funciona perfeitamente somente com HTTP.

O que tentei

Eu tentei algo assim, sem sucesso:

server {
    listen 443 default_server;
    server_name custom-domain.myproduct.com;
    ssl on;
    ssl_certificate /etc/nginx/ssl/$http_host/server.crt; # note the http_host variable
    ssl_certificate_key /etc/nginx/ssl/$http_host/server.key; # also here
}
    
por Renato Gama 20.02.2015 / 14:12

1 resposta

2

How can I dynamically choose which certificate to use for the SSL connection based on the Host header?

O cabeçalho do Host faz parte do protocolo HTTP, mas o HTTPS é HTTP incorporado a uma conexão SSL. O que significa que você primeiro precisa estabelecer a conexão SSL (que precisa do certificado) antes de ter acesso ao cabeçalho do Host.

Se o cliente suportar SNI (todos os navegadores modernos o fazem, mas o IE / XP não), ele já enviará o nome de destino dentro do handshake SSL. Fornecer certificados diferentes com base no nome de destino geralmente é feito com seções de servidor diferentes no nginx. Você pode tentar usar o $ssl_server_name na seção padrão, mas não tenho certeza se isso funcionará e, mesmo que isso funcione, isso pode afetar as otimizações, como o cache de sessão, de maneira negativa.

    
por 20.02.2015 / 14:37

Tags