我们有一个私有的 Gitlab 实例,计划对外公开,为了确保只有员工可以连接到网站,我推出了一个带有用户证书的小型内部 CA,以便进行相互认证。当我打开 ssl_verify_client 时,它会在 Web 服务器端执行预期的操作,如果没有证书(或证书无效),则会返回 400 错误,如果提交了有效证书,则页面会正确加载。
奇怪的是,它破坏了 Gitlab 根据 ssh 密钥识别用户的能力。
例子:
站点配置文件片段:
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;
用户盒:
% ssh git@gitlab
PTY allocation request failed on channel 0
Welcome to GitLab, [username]!
Connection to gitlab.domain.local closed.
站点配置文件片段:
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;
用户盒:
% ssh git@gitlab
PTY allocation request failed on channel 0
Welcome to GitLab, Anonymous!
Connection to gitlab.domain.local closed.
有人能解释一下这是怎么发生的,以及如何解决它吗?我很困惑,因为它们肯定是完全不同的服务?除非我遗漏了什么,处理 ssh 的 shell 正在通过 nginx 建立连接,但连接失败了。老实说,我并不完全理解 gitlab 架构是如何与 ssh、git 和 gitlab-shell 之间的集成一起工作的。也许如果我让它只适用于外部连接,那么它就会起作用?在我盲目尝试之前,希望得到一些意见。
编辑:
好的,根据这些条目,这肯定是正在发生的事情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>
>.
问题是,是给它一个客户端证书来使用还是修改 nginx conf 以便它只需要来自外部 IP 的 HTTPS 更好?我认为后者更好,否则就会产生不必要的 SSL 连接开销,因为它只存在于盒子上的服务之间。
答案1
我写了一篇博客文章介绍如何解决这个问题,你可以阅读它这里。
总结一下,我设置了一个 nginx 服务器来处理盒子外部的 HTTPS 连接(即浏览 Web 界面的用户),以及第二个仅监听本地主机的 HTTP 服务器。然后我配置 gitlab-shell 以使用 connect 来http://localhost/
绕过 HTTPS 证书错误的问题。
答案2
将我们的 gitlab 服务器移至新域后,我遇到了同样的错误。在编辑后,问题已得到解决
/home/git/gitlab-shell/config.yml
改变的设置位于
gitlab_url: "https://mynewdomain.com/"
文件顶部附近。