O Nginx rejeita nomes de servidores desconhecidos por HTTPS

7

Eu tenho uma instância do Nginx usando o SNI para atender a vários domínios HTTPS a partir de um único IP.

A única falha na configuração é que o Nginx responde com o primeiro domínio (atuando como padrão) sempre que uma URL para o IP simples do servidor ou um domínio listado nesse IP para o qual não há um bloco de servidor HTTPS correspondente. Nesse caso, eu preferiria simplesmente retornar um 403 Proibido padrão - eu configuraria um bloco de servidor padrão para fazer isso, mas não vejo uma maneira de contornar os avisos de incompatibilidade de certificado de cliente.

(Como c | C) eu configuro o Nginx para rejeitar solicitações para domínios desconhecidos / indefinidos sem precisar especificar um certificado SSL específico que perturbará os navegadores? (ou seja, preciso que o Nginx rejeite a solicitação com um 403 antes de perturbar o cliente com um certificado "ruim" - do POV do cliente, isso deve ser idêntico ao caso em que nenhum bloco de servidor HTTPS está definido.)

Carlton Gibson
fonte

Respostas:

7

Esta pergunta é bastante semelhante à que eu respondi ontem: nginx e SNI: é possível resolver automaticamente o certificado SSL por nome de domínio

Não é possível rejeitar a conexão antes que o usuário veja uma mensagem de certificado incorreto em seu navegador. Quando o Nginx pode retornar uma resposta HTTP 403, o handshake SSL termina e, para concluir o handshake, o navegador deve aceitar o certificado fornecido. Você só pode rejeitar a conexão depois que o usuário aceitou o certificado configurando um servidor padrão:

server {
    listen 433 default_server ssl;
    ssl_certificate       common.crt;
    ssl_certificate_key   common.key;
    return 403;
}

No entanto, os navegadores mais recentes suportam a indicação de nome de servidor e, se você tiver um certificado definido para cada vhost, é muito improvável que um usuário normal veja essa mensagem.

Pode ser possível rejeitar conexões sem nome de host válido indicado por SSL com iptables, mas isso provavelmente é bastante complicado e não seria compatível com nenhum padrão.

Informações atualizadas: É possível return 444abortar a conexão tcp imediatamente antes que um erro de certificado seja mostrado.

xblax
fonte
Usando o SNI, você pode abortar teoricamente a conexão quando não houver um certificado para o nome de domínio especificado, o que seria ainda melhor do que exibir um erro de certificação. Você sabe como fazer isso?
Yogu 28/10
Sim, descobri que é possível return 444interromper a conexão tcp antes que um erro de certificação seja mostrado.
Xblax # 30/14
@xblax Você também pode nos dizer como devolver 444 antes que um certificado seja exibido? Idealmente, eu não desperdiçaria recursos em um handshake para uma solicitação para um server_name que eu não conheço. O SNI deve revelar o nome solicitado antes mesmo de descriptografar a solicitação.
Static Storm
0

Se seus domínios forem subdomínios do mesmo mestre (* .example.com), você poderá usar um certificado curinga. Caso contrário, acho que você não pode fornecer nenhum certificado com o qual o navegador ficará satisfeito.

Chris Nava
fonte
Oi Cris. Eu aprecio o ponto curinga, mas não é exatamente o que estou perguntando. Sim, o navegador não vai gostar de nenhum certificado, mas existe alguma maneira de rejeitar a conexão com base no nome do servidor solicitado? (Eu estou suspeitando que não, mas este parece ser o lugar para perguntar ... :)
Carlton Gibson
Suposição não testada -> Você precisará fornecer um certificado válido ou o navegador considerará a conexão insegura. Portanto, o navegador não atuará em nenhum redirecionamento enviado até que o usuário permita uma substituição. A única maneira de pensar para executar automaticamente a substituição é fornecer um certificado válido. :-(
Chris Nava