在 Nginx 中開啟 ssl_verify_client 導致 Gitlab 使用者辨識失敗
我們有一個私有的 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/"
位於文件頂部附近。