Подключение letsencrypt для gitlab с нуля или при переходе с платного сертификата на letsencrypt.
#обновление certbot для поддержки протокола ACMEv2.
Для начала на всякий случай определить версию gitlab. В некоторых версиях надо включать в конфигах возможность использования letsencrypt или настройки могут отличаться. Я работал с версией 11.2.3
cat /opt/gitlab/version-manifest.txt | grep gitlab-ce
Создаётся каталог для процесса получения сертификата.
mkdir -p /var/www/letsencrypt
В конфигурацию /etc/gitlab/gitlab.rb надо добавить следующую строку(nano /etc/gitlab/gitlab.rb):
nginx['custom_gitlab_server_config'] = "location ^~ /.well-known { root /var/www/letsencrypt; }"
И перечитать конфигурацию:
gitlab-ctl reconfigure
После этого можно начать процесс получения сертификата:
certbot certonly --webroot --webroot-path=/var/www/letsencrypt -d hostname.com
Если не прокатывает (Connection refused, например, при работе программы acme), то проверить строку external_url ‘https: — должно быть пока что http (без «s») (файл — /etc/gitlab/gitlab.rb).
Или попробовать вот такой вариант (я не проверял его):
nginx['redirect_http_to_https'] = false nginx['custom_nginx_config'] = 'include /etc/gitlab/nginx-https-redirects.conf;'server { listen 0.0.0.0:80; listen [::]:80; server_name git.example.com mattermost.example.com gitlabci.example.com registry.example.com; server_tokens off; access_log /var/log/gitlab/nginx/gitlab_registry_access.log gitlab_access; error_log /var/log/gitlab/nginx/gitlab_registry_error.log; location /.well-known/acme-challenge/ { alias /var/run/acme/acme-challenge/; } location / { return 301 https://$http_host:$request_uri; } }
После успешного создания сертификата, надо отредактировать файл /etc/gitlab/gitlab.rb, чтобы блок # GitLab Nginx # содержал следующие строки :
nginx['custom_gitlab_server_config'] = "location ^~ /.well-known { root /var/www/letsencrypt; }" nginx['redirect_http_to_https'] = true nginx['ssl_certificate'] = "/etc/letsencrypt/live/hostname.com/fullchain.pem" nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/hostname.com/privkey.pem"
А так же строка external_url должна содержать https перед именем хоста.
Пути к сертификату будут отличаться лишь названием хоста. После этого снова перечитать конфигурацию.
gitlab-ctl reconfigure
После этого сертификат должен заработать. Реконфигурация должна прописать верные пути к файлам сертификата в конфиге nginx:
nano /var/opt/gitlab/nginx/conf/gitlab-http.conf
В моём случае gitlab использовал платный сертификат и после описанных выше действий более ничего не потребовалось.
Автоматическое обновление сертификата в cron:
0 0 */2 * * /usr/bin/letsencrypt renew >> /var/log/le-renew.log 5 0 */2 * * /usr/bin/gitlab-ctl restart nginx
#обновление certbot для поддержки протокола ACMEv2
certbot --version apt-get remove certbot wget https://dl.eff.org/certbot-auto mv certbot-auto /usr/local/bin/certbot-auto chown root /usr/local/bin/certbot-auto chmod 0755 /usr/local/bin/certbot-auto
Поскольку гитлаб управляет nginx, то команда на получение сертификата будет выглядеть вот так:
/usr/local/bin/certbot-auto certonly --webroot
В процессе её выполнения будет запрошено имя домена и каталог webroot. Каталог у меня /var/www/letsencrypt как по инструкции выше, я делаю обновление на том же сервере gitlab. Всё должно завершится успешным получением новых сертификатов (в процессе выполнения команды программа предложит выполнить обновление опционально: Renew & replace the cert (limit ~5 per 7 days)).
Проверить, появился ли новый профиль для обновления сертификатов по протоколу acmev2 можно вот так:
ls /etc/letsencrypt/accounts/
В каталоге должен будет присутствовать каталог с именем вида:
acme-v02.api.letsencrypt.org
Теперь надо выполнить команду для автоматического обновления сертификата:
echo "0 0,12 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && /usr/local/bin/certbot-auto renew --pre-hook 'gitlab-ctl stop nginx' --post-hook 'gitlab-ctl start nginx'" | sudo tee -a /etc/crontab > /dev/null
И не забываем убрать старые команды обновления из крона.
Использовал материал:
https://community.vscale.io/hc/ru/community/posts/115003739805-%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-HTTPS-%D0%B2-GitLab-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-Let-s-Encrypt
https://www.8host.com/blog/sozdanie-sertifikata-lets-encrypt-dlya-gitlab-v-ubuntu-16-04/
https://www.digitalocean.com/community/tutorials/how-to-secure-gitlab-with-let-s-encrypt-on-ubuntu-16-04
https://docs.gitlab.com/omnibus/settings/ssl.html#renewing