• 1. 介绍
  • 2. 申请证书
  • 3. 改造gitlab
  • 4. 复制证书

    1. 介绍

    在以前的一篇文章我们介绍过如何用docker来部署gitlab应用:使用 compose 部署 GitLab 应用 (八)

    还有一篇文章是介绍用acme.sh给网站加上https的:使用 acme.sh 安装 Let’ s Encrypt 提供的免费 SSL 证书

    现在这篇文章来结合之前的两篇文章的内容,给gitlab网站加上https应用的。

    2. 申请证书

    第一步是申请证书:

    1. $ acme.sh --issue -d gitlab.rails365.net -w /srv/docker/gitlab/gitlab

    /srv/docker/gitlab/gitlab是gitlab这个docker所使用的数据卷的目录。

    执行这行命令,你会发现输出是这样的:

    1. [Sun Mar 12 11:06:15 CST 2017] Single domain='gitlab.rails365.net'
    2. [Sun Mar 12 11:06:15 CST 2017] Getting domain auth token for each domain
    3. [Sun Mar 12 11:06:15 CST 2017] Getting webroot for domain='gitlab.rails365.net'
    4. [Sun Mar 12 11:06:15 CST 2017] Getting new-authz for domain='gitlab.rails365.net'
    5. [Sun Mar 12 11:06:20 CST 2017] The new-authz request is ok.
    6. [Sun Mar 12 11:06:20 CST 2017] Verifying:gitlab.rails365.net
    7. [Sun Mar 12 11:06:25 CST 2017] gitlab.rails365.net:Verify error:Invalid response from http://gitlab.rails365.net/.well-known/acme-challenge/M383V-Nx8XeuYkzt5gUYIufSbiOuMB5ox3OZyKXz21M:
    8. [Sun Mar 12 11:06:25 CST 2017] Please add '--debug' or '--log' to check more details.
    9. [Sun Mar 12 11:06:25 CST 2017] See: https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh

    主要报错的这一行是这里:

    1. gitlab.rails365.net:Verify error:Invalid response from http://gitlab.rails365.net/.well-known/acme-challenge/M383V-Nx8XeuYkzt5gUYIufSbiOuMB5ox3OZyKXz21M

    其实acme.sh要验证一下这个网站的所有权,也就是说只要你能证明这个网站或域名你是能控制的,就可以了,它是通过向网站写些数据,或读些数据来验证的,比如,在你的网站根目录下新建一个目录.well-known,再往里面写些东西。

    所以我们只要用nginx把这个处理一下就好了:

    比如:

    1. location /.well-known/ {
    2. root /srv/docker/gitlab/gitlab;
    3. }

    下面会给出完整的配置的。

    然后再执行之前的命令就会成功的。

    接着把证书安装到gitlab那里。

    1. $ mkdir /srv/docker/gitlab/gitlab/ssl
    2. $ acme.sh --installcert -d gitlab.rails365.net \
    3. --keypath /srv/docker/gitlab/gitlab/ssl/gitlab.rails365.net.key \
    4. --fullchainpath /srv/docker/gitlab/gitlab/ssl/gitlab.rails365.net.key.pem \
    5. --reloadcmd "sudo nginx -s reload"
    6. $ openssl dhparam -out /srv/docker/gitlab/gitlab/ssl/dhparam.pem 2048

    最后nginx里加上配置:

    1. upstream gitlab {
    2. server 127.0.0.1:10080;
    3. }
    4. server {
    5. listen 443 ssl;
    6. server_name gitlab.rails365.net;
    7. ssl_certificate /srv/docker/gitlab/gitlab/ssl/gitlab.rails365.net.key.pem;
    8. ssl_certificate_key /srv/docker/gitlab/gitlab/ssl/gitlab.rails365.net.key;
    9. # ssl_dhparam
    10. ssl_dhparam /srv/docker/gitlab/gitlab/ssl/dhparam.pem;
    11. server_tokens off;
    12. root /dev/null;
    13. # 配合acme.sh使用ssl, 验证网站
    14. location /.well-known/ {
    15. root /srv/docker/gitlab/gitlab;
    16. }
    17. location / {
    18. proxy_read_timeout 300;
    19. proxy_connect_timeout 300;
    20. proxy_redirect off;
    21. proxy_set_header X-Forwarded-Proto $scheme;
    22. proxy_set_header Host $http_host;
    23. proxy_set_header X-Real-IP $remote_addr;
    24. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    25. proxy_set_header X-Frame-Options SAMEORIGIN;
    26. proxy_pass http://gitlab;
    27. }
    28. }
    29. server {
    30. listen 80;
    31. server_name gitlab.rails365.net;
    32. return 301 https://gitlab.rails365.net$request_uri;
    33. }

    3. 改造gitlab

    经过前面的处理,也是能正常访问的,不过好像有些问题,因为gitlab网站里面还是在使用http协议作为代码的访问协议,而不是https。

    这里要把gitlab改造一下。

    打开docker-compose.yml文件,主要更改以下几个地方:

    1. - GITLAB_HTTPS=true
    2. - GITLAB_PORT=443
    3. gitlab:
    4. restart: always
    5. image: sameersbn/gitlab:8.15.2
    6. depends_on:
    7. - redis
    8. - postgresql
    9. ports:
    10. - "10080:80"
    11. - "10022:22"
    12. - "10443:443"
    13. ...
    14. - GITLAB_HTTPS=true
    15. - SSL_SELF_SIGNED=false
    16. - GITLAB_HOST=gitlab.rails365.net
    17. - GITLAB_PORT=443
    18. - GITLAB_SSH_PORT=10022

    开启了gitlab的https服务,把https的服务的端口改为了443,并且暴露了10443端口。

    然后nginx里也改变一下:

    1. upstream gitlab {
    2. server 127.0.0.1:10443;
    3. }
    4. location / {
    5. ...
    6. proxy_pass https://gitlab;
    7. }

    端口变了,变成了10443,还有http://gitlab变成了https://gitlab

    4. 复制证书

    你要把证书复制到gitlab下。

    1. mkdir -p /srv/docker/gitlab/gitlab/certs
    2. cp /srv/docker/gitlab/gitlab/ssl/gitlab.rails365.net.key.pem /srv/docker/gitlab/gitlab/certs/gitlab.crt
    3. cp /srv/docker/gitlab/gitlab/ssl/gitlab.rails365.net.key /srv/docker/gitlab/gitlab/certs/gitlab.key
    4. cp /srv/docker/gitlab/gitlab/ssl/dhparam.pem /srv/docker/gitlab/gitlab/certs/dhparam.pem
    5. chmod 400 /srv/docker/gitlab/gitlab/certs/gitlab.key

    现在可以正常以https访问gitlab了。

    17. 给 GitLab 应用加上 https - 图1

    17. 给 GitLab 应用加上 https - 图2

    完结。