Подключение letsencrypt для gitlab

Подключение 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;
}
}

https://gitlab.com/gitlab-org/omnibus-gitlab/issues/1096

После успешного создания сертификата, надо отредактировать файл /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

Добавить комментарий