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

6

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

Aqui estão 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;                                                                                                                                                     
} 

Primeiro servidor responde com 200 código http, mas segundo retorna "400 Solicitação incorreta, Nenhum certificado SSL necessário foi enviado, nginx / 1.0.4".

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

    
por Alexander Artemenko 02.11.2011 / 13:00

5 respostas

1

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

Em versões antigas do nginx, a configuração ssl_verify_client do host virtual padrão era usada para todos os outros hosts virtuais baseados em nome na mesma combinação IP + porta. Algumas outras opções de 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ê não conseguir atualizar.

Anote o changelog do nginx para a versão 1.0.9:

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

Mudanças relevantes na fonte do nginx: r4034 no tronco, r4246 no ramo 1.0.

    
por 18.12.2012 / 21:38
1

Eu me deparei com um problema semelhante, mas procurando distinguir o ssl_verify_clients entre os blocos de localização dentro de um bloco de servidor, em vez de 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-os 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. Use

ssl_verify_client optional;

no bloco do servidor, e use instruções if nas várias localizações, por exemplo:

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

Eu precisava fazer isso para dar acesso de administrador a um webapp, mas ainda permitir webhooks do github sem dar ao github um certificado ssl de cliente.

    
por 23.10.2014 / 22:25
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 seus certificados de clientes indo em Preferências - > Avançado - > Criptografia - > Ver 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.

    
por 02.11.2011 / 13:50
0

Não sou especialista em nginx, mas já vi problemas semelhantes com o apache usando SSL e hosts virtuais. O problema é a ordem em que 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á qual hostname você está solicitando. E até que ele saiba, ele usará a configuração padrão - que, nesse caso, é o primeiro host, que requer um certificado de cliente para estabelecer a conexão SSL.

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

    
por 16.11.2012 / 14:09
-1

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

Por favor, tente adicionar default_server flag para o segundo servidor

listen 443 ssl default_server;
    
por 05.09.2012 / 09:14

Tags