Включение ssl_verify_client в Nginx приводит к сбою идентификации пользователя Gitlab

У нас есть частный экземпляр Gitlab, который мы планируем раскрыть извне, чтобы гарантировать, что только сотрудники могут подключаться к веб-сайту. Я развернул небольшой внутренний центр сертификации с пользовательскими сертификатами для взаимной аутентификации. Когда я включаю ssl_verify_client, он выполняет то, что ожидается на стороне веб-сервера, если сертификат не выдан (или недействительный сертификат), возвращается ошибка 400, если передан действительный сертификат, то страница загружается правильно.

Что странно, так это то, что это нарушает способность Gitlab идентифицировать пользователей по их ключу ssh.

Пример:

Фрагмент сайта 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;

Ящик пользователя:

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

Фрагмент сайта 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;

Ящик пользователя:

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

Может кто-нибудь объяснить, как это происходит и как это исправить? Я в растерянности, так как они совершенно разные услуги, конечно? Если нет чего-то, что я пропускаю, и оболочка, обрабатывающая ssh, устанавливает соединение через 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, чтобы он требовал только HTTPS от внешних IP-адресов? Я думаю, что последнее лучше, в противном случае возникают издержки на SSL-соединение, которые не нужны, поскольку только между службами на коробке.

2 ответа

Решение

Я написал в блоге, как я решил проблему, вы можете прочитать здесь.

В итоге я настроил один сервер nginx для обработки внешних подключений HTTPS (например, пользователей, просматривающих веб-интерфейс) и второй HTTP-сервер, который прослушивает только локальный хост. Затем я настраиваю gitlab-shell для использования connect to http://localhost/ Поэтому в обход проблемы с сертификатом HTTPS.

У меня была та же ошибка после перемещения нашего сервера gitlab в новый домен. Проблема была решена для меня после редактирования /home/git/gitlab-shell/config.yml

Настройка изменилась была gitlab_url: "https://mynewdomain.com/"в верхней части файла.

Другие вопросы по тегам