Как настроить Gitlab EE с HTTPS на сервере DirectAdmin?

Я уже настроил сервер Omnibus Gitlab на моем Centos7 VPS (DirectAdmin), используя этот пост: как установить gitlab на сервере directadmin

Он отлично работал с HTTP-запросами. Из соображений безопасности я хочу настроить HTTPS на поддомене GitLab gitlab.domain.com. Я хочу использовать бесплатные SSL-сертификаты LetsEncrypt. Проблема в том, что LetsEncrypt не может аутентифицировать мой домен с помощью Certbot: certbot certonly --webroot --webroot-path = / var / www / letsencrypt -d gitlab.domain.com

Сбой с выводом:

IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: gitlab.domain.com
   Type:   unauthorized
   Detail: Invalid response from
   http://gitlab.domain.com/.well-known/acme-challenge/8Xj5vc-KMfhHYgH7PhXCFEetcxzQBDk-puiA2tRfoB4:
   "<!DOCTYPE html>\n<html class=\"devise-layout-html\">\n<head
   prefix=\"og: http://ogp.me/ns#\">\n<meta charset=\"utf-8\">\n<meta
   content=\"IE"

   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A/AAAA record(s) for that domain
   contain(s) the right IP address.

Я гуглил это, и кажется, что LetsEncrypt должен найти путь к папке:

http://gitlab.domain.com/.well-known/acme-challenge/xxxxxxxxxx

Поэтому я создал путь и дал разрешение 777 и в целях тестирования поместил в него файл test.html. Теперь у меня есть доступ к файлу по HTTP, но я не могу получить по нему HTTPS.

curl -I -k https://gitlab.domain.com/.well-known/acme-challenge/test.html

Выход:

HTTP/1.1 301 Moved Permanently
Date: Wed, 06 Feb 2019 10:05:40 GMT
Server: Apache/2
Location: http://gitlab.domain.com/.well-known/acme-challenge/test.html
Content-Type: text/html; charset=iso-8859-1

У меня уже есть DirectAdmin на сервере, и я не могу понять, как настроить файл HTTPD.conf моего субдомена, чтобы все работало нормально.

Пользовательский раздел HTTPD.conf прямого администратора:

ServerName gitlab.domain.com
ServerSignature Off

ProxyPreserveHost On

# Ensure that encoded slashes are not decoded but left in their encoded state.
# http://doc.gitlab.com/ce/api/projects.html#get-single-project
AllowEncodedSlashes NoDecode

<Location />
  Order deny,allow
  Allow from all

  #Allow forwarding to gitlab-workhorse
  ProxyPassReverse http://127.0.0.1:8181
  ProxyPassReverse http://gitlab.domain.com/
</Location>

# Apache equivalent of nginx try files
# http://serverfault.com/questions/290784/what-is-apaches-equivalent-of-nginxs-try-files
# http://stackru.com/questions/10954516/apache2-proxypass-for-rails-app-gitlab
RewriteEngine on

# Forward all requests to gitlab-workhorse except existing files like error documents
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} ^/uploads/.* [NC,OR]
RewriteCond %{REQUEST_URI} !^.*/\.well-known/acme-challenge/.*$ [NC]
RewriteRule .* http://127.0.0.1:8181%{REQUEST_URI} [P,QSA,NE]

Alias /.well-known/acme-challenge/ /var/www/letsencrypt/
<Directory "/var/www/letsencrypt/">
     Order allow,deny
     Options Indexes FollowSymLinks MultiViews
     AllowOverride None
     Allow from all
</Directory>

# needed for downloading attachments
DocumentRoot /opt/gitlab/embedded/service/gitlab-rails/public

Стоит отметить, что тестирование моего домена с использованием https://letsdebug.net/ с методами HTTP-01 и DNS-01 показывает, что все в порядке.

Я думаю, что если бы я мог обрабатывать запросы HTTPS, чтобы гарантировать доступ API-интерфейса LetsEncrypt к http://gitlab.domain.com/.well-known/acme-challenge/ URL через HTTP и HTTPS, все будет в порядке.

1 ответ

Решение

Поскольку никто не ответил на мой вопрос, я работал над ним и, наконец, я нашел ответ.

На самом деле проблема возникла из двух частей:

1. Когда вы хотите указать путь, который содержит специальные символы, такие как ".", "\" Или пробел в строке с "...", вы должны использовать его в "\." формат. Я настаиваю на том, что это применимо только в том случае, если у вас есть строка, заключенная в двойные кавычки, а не все параметры, которые есть в вашем файле конфигурации.

<Directory "/var/www/default/\.well-known/acme-challenge/">

Таким образом, правильная форма псевдонима / части каталога выглядит так:

Alias /.well-known/acme-challenge/ /var/www/default/.well-known/acme-challenge/
<Directory "/var/www/default/\.well-known/acme-challenge/">
    Options None
    AllowOverride None
    ForceType text/plain
    RedirectMatch 404 "^(?!/\.well-known/acme-challenge/[\w-]{43}$)"
</Directory>

Вы можете получить "HTTP/1.1 302 Found", а не "HTTP/1.1 200 OK", когда вы называете URL тестового файла 'curl'. Он возвращает 302, потому что вы каким-то образом перенаправляете запрос куда-то еще, чем вы видите в адресной строке. Но это нормально для авторизации домена LetsEncrypt.

curl -I http://example.com/.well-known/acme-challenge/test.html

2. Когда вы вызываете команду certbot или letsencrypt, в параметре webroot она должна указывать на корень вашего каталога вызовов ACME (/var/www/default/), а не конечный пункт назначения сертификатов (/var/www/default/.well-known/acme-challenge/), потому что сам acmetool создает путь к каталогу в каждом предоставленном вами webroot. Поэтому правильная форма команды certbot или letsencrypt для вышеупомянутого Alias ​​/Directory должна быть такой:

letsencrypt certonly --webroot -w /var/www/default/ -d example.com -d www.example.com --renew-by-default

или же

certbot certonly --webroot --webroot-path=/var/www/default/ -d example.com

Я очень плохо знаком с конфигурацией Apache, но, поскольку я искал проблему, это очень популярная проблема для тех, кто хочет использовать LetsEncrypt на сервере Apache. Так что простите, если это элементарный вопрос для большинства из вас, ребята.

Наслаждайтесь!

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