nginx e SNI: é possível resolver automaticamente o certificado SSL por nome de domínio

1

Eu preciso configurar um servidor que irá armazenar o mesmo conteúdo em SSL usando diferentes nomes de domínio. O problema é que preciso da capacidade de adicionar novos nomes de domínio com a maior facilidade possível. Supondo que todos os nomes de domínio já estão configurados para o meu servidor, eu acho que é possível configurar o nginx (ou talvez outro proxy reverso) de forma que ele escute todas as solicitações para um determinado IP e depois de obter uma requisição HTTPS tente procurar. um certificado de domínio que foi usado para fazer essa solicitação em alguma pasta ou banco de dados e atender a solicitação se o certificado foi encontrado (para que possamos estabelecer conexão segura) ou rejeitar a conexão se o certificado não foi encontrado.

Não tenho certeza se é possível ou se estou pensando em algo imprudente, mas como não consegui encontrar nenhuma informação na internet, decidi perguntar aqui.

Pelo que entendi, a solução mais simples para isso será adicionar uma configuração separada para cada domínio que deve ser suportado.

    
por Ashald 11.02.2014 / 15:12

1 resposta

2

Eu acho que não há outra solução além de criar uma configuração separada para cada vhost. Usando modelos que devem ser bastante simples.

No entanto, o SNI ainda não é suportado por alguns navegadores (todos os navegadores recentes). Esses navegadores podem mostrar uma mensagem de certificado inválida.

Se você quiser rejeitar conexões para alguns vhosts sem certificado, simplesmente não habilite ssl nesses vhosts. Adicione um servidor padrão que capture todas as conexões para vhosts desconhecidos na porta ssl e retorne um erro (403 forbiden ou não padrão 444 para tcp reset):

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

Você não pode impedir a mensagem de certificado inválida em vhosts sem ssl, pois não é possível cancelar a conexão tcp antes do handshake SSL usando nginx. Você pode tentar que o iptables rejeite apertos de mão não sni ssl, mas isso pode ser um pouco difícil de configurar corretamente e provavelmente exigirá algum conhecimento das especificações ssl.

    
por 11.02.2014 / 16:14