A ativação do ssl_verify_client no Nginx faz com que a identificação do usuário do Gitlab falhe

1

Temos uma instância privada do Gitlab que planejamos expor externamente, a fim de garantir que apenas os funcionários possam se conectar ao site. Eu implementei uma pequena CA interna com certificados de usuário para ter autenticação mútua. Quando eu ligo o ssl_verify_client, ele faz o que é esperado no lado do servidor web, se nenhum certificado (ou cert inválido) for apresentado, um erro 400 será retornado, se um certificado válido for enviado, a página será carregada corretamente.

O mais estranho é que isso quebra a capacidade do Gitlab de identificar usuários com base em sua chave ssh.

Exemplo:

Fragmento do site conf:

ssl_certificate /usr/local/nginx/config/gitlab.chained.crt;
ssl_certificate_key /usr/local/nginx/config/gitlab.key;
ssl_client_certificate /usr/local/nginx/config/Root_CA.crt;
ssl_ciphers HIGH+aRSA:!kSRP;
ssl_prefer_server_ciphers on;
ssl_dhparam /usr/local/nginx/config/dh2048.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#  ssl_verify_client on;
ssl_verify_depth 2;

Caixa do usuário:

% ssh git@gitlab
PTY allocation request failed on channel 0
Welcome to GitLab, [username]!
Connection to gitlab.domain.local closed.

Fragmento do site conf:

ssl_certificate /usr/local/nginx/config/gitlab.chained.crt;
ssl_certificate_key /usr/local/nginx/config/gitlab.key;
ssl_client_certificate /usr/local/nginx/config/Root_CA.crt;
ssl_ciphers HIGH+aRSA:!kSRP;
ssl_prefer_server_ciphers on;
ssl_dhparam /usr/local/nginx/config/dh2048.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_verify_client on;
ssl_verify_depth 2;

Caixa do usuário:

% ssh git@gitlab
PTY allocation request failed on channel 0
Welcome to GitLab, Anonymous!
Connection to gitlab.domain.local closed.

Alguém pode explicar como isso acontece e como corrigi-lo? Eu estou perdido porque são serviços completamente diferentes, certamente? A menos que haja algo que esteja faltando e o shell manipulando o ssh esteja fazendo uma conexão através do nginx que está falhando. Para ser honesto, não entendo completamente como a arquitetura do gitlab funciona com a integração entre o ssh, git e gitlab-shell. Talvez se eu fizer isso se aplicar apenas a conexões externas, então funcionará? Gostaria de receber informações antes de fotografar no escuro.

EDIT:

Ok, isso é definitivamente o que está acontecendo com base nessas entradas nos logs gitlab-shell :

E, [2014-02-18T12:12:46.275674 #20681] ERROR -- : API call <GET https://gitlab.premiumsoftware.co.za//api/v3/internal/discover?key_id=2> failed: 400 => <<html>
<head><title>400 No required SSL certificate was sent</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<center>No required SSL certificate was sent</center>
<hr><center>nginx</center>
</body>
</html>
>.

A questão é: é melhor dar a ele um certificado de cliente para trabalhar com ou modificar o conf nginx, para que ele só requeira HTTPS de IPs externos? Eu acho que o último é melhor caso contrário, há uma sobrecarga de conexão SSL que é desnecessária, pois é apenas entre serviços na caixa.

    
por JonoCoetzee 18.02.2014 / 13:23

2 respostas

0

Eu escrevi um post no blog sobre como resolvi o problema, você pode lê-lo aqui .

Como resumo, configurei um servidor nginx para lidar com conexões HTTPS externas à caixa (ou seja, usuários navegando na interface da web) e um segundo servidor HTTP que apenas escuta no host local. Em seguida, configurei o gitlab-shell para usar a conexão com http://localhost/ , ignorando o problema dos erros de certificado HTTPS.

    
por 14.03.2014 / 13:49
0

Eu tive o mesmo erro depois de mover nosso servidor gitlab para um novo domínio. O problema foi resolvido por mim depois da edição /home/git/gitlab-shell/config.yml

A configuração alterada foi a %código% perto do topo do arquivo.

    
por 05.11.2015 / 12:44