Nginx / SNI: Retorna 444 se não houver certificado disponível para um domínio específico hospedado no mesmo IP

2

Estou empenhado em configurar o nginx em relação ao suporte a SSL e SNI.

Para simplificar meu caso, digamos que eu tenha dois domínios, foo.com e bar.com . Eu tenho apenas um IP e ambos os domínios são mapeados para este. Eu quero que foo.com esteja disponível via https , mas não bar.com . Este último deve ser apenas indisponível na porta 443. Eu sei que isso não é possível com o SSL simples, mas me disseram que eu posso confiar com segurança no SNI nos dias de hoje. Portanto, presumo que meu navegador (Chrome) envie o domínio do site que deseja acessar juntamente com a solicitação de inicialização do SSL.

Se eu acessar bar.com , o nginx usará o certificado configurado emitido para bar.com , perfeito. Se eu acessar https://foo.com , para o qual nenhuma diretiva listen *:443 realmente existe, o nginx também responde com o certificado para bar.com , portanto, o Chrome lança uma exceção de certificado. Eu tentei configurar a diretiva de escuta SSL para foo.com e adicionei o seguinte código no vhost sem sucesso:

if ($server_port = 443) {
  return 444;
}

Agora ele envia o certificado errado e só depois nega a conexão.

É possível deixar o nginx fechar a conexão antes que qualquer resposta SSL seja enviada de volta ao navegador se o nginx não puder encontrar um certificado apropriado para o domínio solicitado?

    
por creethy 07.04.2014 / 23:26

1 resposta

0

O Nginx usa o primeiro host virtual apropriado (por porta e ssl) quando não consegue encontrar um host virtual para o domínio especificado. Você precisa adicionar uma server {} entry antes de todas as outras server {} entradas, para que o Nginx a use para https://foo.com e outras solicitações HTTPS com um domínio desconhecido:

server {
    listen 443 ssl;

    ssl_certificate /path/to/certificate.crt;
    ssl_certificate_key /path/to/certificate.key;

    return 404;
    # or return 444; to just drop such connections
    # or return 302 http://$host$request_uri; to redirect them to HTTP
}

Ele precisa de um certificado SSL para funcionar, mas você pode gera um auto-assinado (o certificado não precisa ser válido).

    
por 06.09.2018 / 02:57

Tags