Como usar ssl_verify_client = ON em um servidor virtual e ssl_verify_client = OFF em outro?

9

Quero forçar a verificação do cliente ssl em um dos meus hosts virtuais. Mas obtenha o erro "Nenhum certificado SSL necessário foi enviado", tentando obter algo dele.

Aqui estão as minhas configurações de teste:

# defaults                                                                                                                                                                    
ssl_certificate /etc/certs/server.cer;                                                                                                                                 
ssl_certificate_key /etc/certs/privkey-server.pem;                                                                                                                     
ssl_client_certificate /etc/certs/allcas.pem;                                                                                                                                 

server {                                                                                                                                                                      
    listen 1443 ssl;                                                                                                                                                          
    server_name server1.example.com;                                                                                                                                          
    root /tmp/root/server1;                                                                                                                                                   

    ssl_verify_client off;                                                                                                                                                    
}                                                                                                                                                                             

server {                                                                                                                                                                      
    listen 1443 ssl;                                                                                                                                                          
    server_name server2.example.com;                                                                                                                                          
    root /tmp/root/server2;                                                                                                                                                   

    ssl_verify_client on;                                                                                                                                                     
} 

O primeiro servidor responde com 200 códigos http, mas o segundo retorna "400 Solicitação inválida, nenhum certificado SSL necessário foi enviado, nginx / 1.0.4".

Provavelmente, é implossível usar ssl_verify_client no mesmo IP? Devo vincular esses servidores a IPs diferentes, isso resolverá o meu problema?

Alexander Artemenko
fonte

Respostas:

4

Corri para um problema semelhante, mas procurando distinguir os ssl_verify_clientsblocos de localização dentro de um bloco de servidor, e não entre os blocos de servidor. Você provavelmente poderia resolver seu problema movendo o material de configuração SSL padrão para os dois servidores (duplicando-o, com certeza, ou colocando todos em um bloco de servidor, aceitando os vários subdomínios e usando locais).

Para a solução baseada em localização, parece com os seguintes trabalhos. Usar

ssl_verify_client optional;

no bloco do servidor e use instruções if nos vários locais, por exemplo:

if ($ssl_client_verify != SUCCESS) { return 403; }

Eu precisava fazer isso para dar acesso de administrador a um aplicativo da web, mas ainda permitir webhooks do github sem dar ao github um certificado SSL do cliente.

Ethan
fonte
2

Você precisa atualizar pelo menos para nginx> = 1.0.9 se desejar ter vários hosts virtuais baseados em nome (usando SNI) no mesmo endereço IP e porta, mas com ssl_verify_clientconfigurações diferentes para esses hosts.

Nas versões mais antigas do nginx, a ssl_verify_clientconfiguração do host virtual padrão era usada para todos os outros hosts virtuais baseados em nome na mesma combinação de portas IP +. Algumas outras opções SSL ( ssl_verify_depth, ssl_prefer_server_ciphers) também foram tratadas da mesma maneira. Usar um IP ou porta separada pode ser uma solução alternativa se você absolutamente não puder atualizar.

Nota do changelog do nginx para 1.0.9:

*) Bugfix: the "ssl_verify_client", "ssl_verify_depth", and
   "ssl_prefer_server_ciphers" directives might work incorrectly if SNI
   was used.

Alterações relevantes na fonte nginx: r4034 no tronco, r4246 no ramo 1.0.

Sergey Vlasov
fonte
0

Você carregou o certificado de cliente (no formato PKCS12) assinado pela CA "/etc/certs/allcas.pem" no seu navegador? No Firefox, você pode verificar os certificados de seu cliente acessando Preferências -> Avançado -> Criptografia -> Exibir Certificados -> Seus certificados.

O valor do parâmetro "ssl_verify_client" se "off" por padrão. Você também pode usar o valor "opcional" se o certificado do cliente SSL não for obrigatório.

user1025596
fonte
Estou acostumado curl --cert ... com os mesmos resultados.
Alexander Artemenko (
Existe algo interessante no log de erros do nginx? (provavelmente /var/log/nginx/error.log)
user1025596
0

Não sou especialista em nginx, mas já vi problemas semelhantes com o apache usando SSL e hosts virtuais. O problema é a ordem na qual o servidor lida com a negociação SSL versus a escolha do host virtual. A primeira etapa é estabelecer a conexão criptografada e somente depois disso, o servidor verá o nome do host que você está solicitando. E, até que saiba, usará a configuração padrão - que neste caso é o primeiro host, que requer um certificado de cliente para estabelecer a conexão SSL.

Portanto, resposta curta - nesse caso, seria melhor ter portas separadas ou endereços IP separados.

Jenny D
fonte
-1

Encontrei o mesmo problema e encontrei uma solução.

Tente adicionar default_serversinalizador para o segundo servidor

listen 443 ssl default_server;
yfliu
fonte