Ssh

在 Nginx 中開啟 ssl_verify_client 導致 Gitlab 使用者辨識失敗

  • November 5, 2015

我們有一個私有的 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 連接成本,因為它只是在盒子上的服務之間。

我寫了一篇關於我如何解決問題的部落格文章,你可以在這裡閱讀。

總而言之,我設置了一個 nginx 伺服器來處理盒子外部的 HTTPS 連接(即使用者瀏覽 Web 界面)和第二個 HTTP 伺服器,它只偵聽 localhost。然後我將 gitlab-shell 配置為使用連接,http://localhost/從而繞過 HTTPS 證書錯誤的問題。

將我們的 gitlab 伺服器移動到新域後,我遇到了同樣的錯誤。編輯後問題已為我解決 /home/git/gitlab-shell/config.yml

更改的設置 gitlab_url: "https://mynewdomain.com/" 位於文件頂部附近。

引用自:https://serverfault.com/questions/576436