Por que o nginx exige que o servidor ssl padrão tenha um certificado?

1

Eu tenho um site de teste com dois domínios e desejo ativar SSL para ambos.

Além disso, desejo ter um servidor padrão para exibir uma página de erro se um cliente estiver acessando alguma página desses dois domínios.

Este é o meu nginx.conf :

server {
    listen 443 ssl;
    server_name a.com;
    ssl_certificate a.cert;
    ssl_certificate_key a.key;
}
server {
    listen 443 ssl;
    server_name b.com;
    ssl_certificate b.cert;
    ssl_certificate_key b.key;
}
server {
    listen 443 default_server ssl;
    ...
}

Problema: o servidor padrão deve ter um par certificado / chave válido, mesmo se o cliente estiver se conectando a a.com ou b.com .

Se eu não especificar um par de certificados / chaves no servidor ssl padrão, o nginx me fornecerá este erro:

no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking

Eu não entendo a lógica aqui. Com o SNI ativado, quando um cliente diz claramente que está acessando a.com , que tem um bloco de servidor independente em nginx.conf , por que o nginx ainda exige que o servidor padrão tenha um par de certificados / chaves? Por que ele se incomoda com o servidor padrão?

    
por Cyker 25.07.2018 / 19:00

1 resposta

1

I have a testing site with 2 domains. I want to enable SSL for both and have a default SSL server handling errors (display an error page when clients specify incorrect domain name):

[...]

But I don't understand the logic here. Why does nginx bother with the default server if the client has clearly specified which domain it wants?

O certificado é obrigatório para os servidores ssl , se não houver certificado, qual é o objetivo? HTTPS não funcionaria.

Você deve definir o certificado e a chave SSL, dentro ou fora do bloco do servidor. Se você definir um " default_server ", mas não estiver definindo um domínio, ele sempre exibirá um aviso de que o domínio não corresponde ao certificado (a menos que você esteja usando certificados curinga ou algum outro específico casos de uso).

Quando você define servidores HTTPS baseados em nomes , é necessário ter em mente o seguinte, de os documentos oficiais:

With this configuration a browser receives the default server’s certificate, i.e. www.example.com regardless of the requested server name. This is caused by SSL protocol behaviour. The SSL connection is established before the browser sends an HTTP request and nginx does not know the name of the requested server. Therefore, it may only offer the default server’s certificate.

Como você descobriu, um certificado autoassinado realiza isso e permitirá que você apresente uma página da Web ou redirecione em um default_server caso não haja correspondência para nenhum outro bloco server_name definido, embora possa (dependendo da configuração) apresentar um aviso.

Se sua pergunta é por que você precisa definir um default_server , você não precisa. Se você não especificar um bloco default_server, ele usará o primeiro por ordem alfabética, se alguém acessar seu servidor com um nome de domínio desconhecido (geralmente não acontecerá) ou apresentar o server_name correspondente.

Atualizar

Estendendo minha resposta em resposta ao seu comentário:

The quoted part is what i'm asking. Why does nginx serve the default server's certificate with SNI enabled (keep reading on that page Server Name Indication)

Verifique meu último parágrafo acima, é assim que os hosts virtuais (ou blocos de servidores na terminologia nginx) e o trabalho default_server . O Nginx servirá o bloco default_server se você definir um em um bloco de servidor e o server_name não corresponder à solicitação nos outros blocos. Você pode definir um bloco de servidor com um default_server para forçar um catch-all para aquele bloco específico, caso contrário, o nginx será o padrão para o primeiro servidor block (em nginx.conf ou em sites-enabled / conf.d, se incluído). Ou você o define ou o nginx escolhe o primeiro bloco para essa finalidade, mas um bloco de servidor será o padrão.

Ele não será veiculado a menos que alguém atinja seu servidor com um nome_do_servidor indefinido , seguindo seu exemplo, digamos que alguém apontou "c.com" para o IP de seu nginx, então o default_server irá pegar o pedido e apresentar o que você definiu.

    
por 25.07.2018 / 20:12