如何在 DirectAdmin 服务器上使用 HTTPS 设置 Gitlab EE?

Posted

技术标签:

【中文标题】如何在 DirectAdmin 服务器上使用 HTTPS 设置 Gitlab EE?【英文标题】:How to setup Gitlab EE with HTTPS on a DirectAdmin Server? 【发布时间】:2019-06-29 14:51:52 【问题描述】:

我已经使用这篇文章在我的 Centos7 VPS (DirectAdmin) 上设置了一个 Omnibus Gitlab 服务器: how to install gitlab on a directadmin server

它对 HTTP 请求非常有效。 出于安全原因,我想在 GitLab 子域 gitlab.domain.com 上设置 HTTPS。 我想使用 LetsEncrypt 免费的 SSL 证书。问题是 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://***.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

值得一提的是,使用带有 HTTP-01 和 DNS-01 方法的 https://letsdebug.net/ 测试我的域返回一切正常。

我认为如果我可以处理 HTTPS 请求以保证 LetsEncrypt API 通过 HTTP 和 HTTPS 访问http://gitlab.domain.com/.well-known/acme-challenge/ URL,那就没问题了。

【问题讨论】:

【参考方案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>

当您通过“curl”调用测试文件的 URL 时,您可能会得到“HTTP/1.1 302 Found”而不是“HTTP/1.1 200 OK”。它返回 302 导致您以某种方式将请求重定向到地址栏中实际看到的其他地方。但是 LetsEncrypt 域授权是可以的。

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

2.当您调用 certbot 或 Letencrypt 命令时,在 webroot 参数中它必须指向您的 ACME 质询目录的根目录 (/var/www/default/) 而不是证书的最终目的地 (/var/www /default/.well-known/acme-challenge/) 导致 acmetool 本身在您提供给它的每个 webroot 中创建目录路径。因此,上述别名/目录的 certbot 或letsencrypt 命令的正确形式应如下所示:

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 配置非常陌生,但就我搜索的问题而言,对于那些想要在 Apache 服务器上使用 LetsEncrypt 的人来说,这是一个非常流行的问题。 如果这对你们大多数人来说是一个基本问题,请原谅我。

享受吧!

【讨论】:

以上是关于如何在 DirectAdmin 服务器上使用 HTTPS 设置 Gitlab EE?的主要内容,如果未能解决你的问题,请参考以下文章

在centos 7服务器上使用directadmin和letsencrypt安装HTTP版本2

如何在Directadmin中启用/安装PHP exif?

在 directadmin 上安装 laravel 的 Apache 配置

CentOs系统的服务器,安装的DirectAdmin,可以使用类似GHOST的软件更换硬盘而不影响数据和账户吗?

在 DirectAdmin 上安装 OpenLiteSpeed

在 DirectAdmin 服务器中配置 Laravel 项目