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.