如何使Docker中的GitLab Runner看到自定义CA Root证书

时间:2018-11-05 17:25:09

标签: docker gitlab gitlab-ci gitlab-ci-runner root-certificate

我已经安装并配置了:

  1. 运行在HTTPS上的 ServerA 上的本地 GitLab Omnibus
  2. ServerB
  3. 中作为Docker服务安装的本地 GitLab-Runner

服务器证书是由自定义CA根生成的

配置

我已经将CA根证书放在ServerB上:

/srv/gitlab-runner/config/certs/ca.crt

按照Run GitLab Runner in a container - Docker image installation and configuration中的说明,将Runner安装在 ServerB 上:

docker run -d --name gitlab-runner --restart always \
           -v /srv/gitlab-runner/config:/etc/gitlab-runner \
           -v /var/run/docker.sock:/var/run/docker.sock \
           gitlab/gitlab-runner:latest

按照Registering Runners - One-line registration command中的说明注册亚军:

docker run --rm -t -i 
            -v /srv/gitlab-runner/config:/etc/gitlab-runner 
           --name gitlab-docker-runner gitlab/gitlab-runner register \
           --non-interactive \
           --executor "docker" \
           --docker-image alpine:latest \
           --url "https://MY_PRIVATE_REPO_URL_HERE/" \
           --registration-token "MY_PRIVATE_TOKEN_HERE" \
           --description "MyDockerServer-Runner" \
           --tag-list "TAG_1,TAG_2,TAG_3" \
           --run-untagged \
           --locked="false"

此命令给出以下输出:

  

正在更新CA证书...   
运行时平台arch = amd64 os = linux pid = 5版本= cf91d5e1版本= 11.4.2   
以系统模式运行。

     

正在注册跑步者...成功跑步者= 8UtcUXCY   
转轮成功注册。随时启动它,但是如果它已经在运行,则应该自动重新加载配置!

我检查过

$ docker exec -it gitlab-runner bash 

,然后一次放入容器中,

$ awk -v cmd='openssl x509 -noout -subject' '
/BEGIN/{close(cmd)};{print | cmd}' < /etc/ssl/certs/ca-certificates.crt

自定义CA根目录正确存在

问题

从GitLab-CI运行Gitlab-Runner时,管道失败,告诉我:

  

$ git clone https:// gitlab-ci-token:$ {CI_BUILD_TOKEN} @ ServerA / foo / bar / My-Project.wiki.git

     


克隆到“ My-Project.wiki” ...

     


致命:无法访问“ https://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@ServerA/foo/bar/My-Project.wiki.git/”:服务器证书验证失败。 CAfile:/etc/ssl/certs/ca-certificates.crt CRLfile:无

     


错误:作业失败:退出代码1

它不能识别颁发者(我的自定义CA根),但是根据The self-signed certificates or custom Certification Authorities,第n.1点,它应该是开箱即用的:

  

默认: GitLab Runner读取系统证书存储并根据系统中存储的CA验证GitLab服务器。

然后我从n.3点开始尝试解决方案,编辑

/srv/gitlab-runner/config/config.toml:

并添加:

[[runners]]
tls-ca-file = "/srv/gitlab-runner/config/certs/ca.crt"

但是它仍然不起作用。

如何使Gitlab Runner阅读CA Root证书?

4 个答案:

答案 0 :(得分:3)

您有两个选择:

忽略SSL验证

将其放在您的.gitlab-ci.yml顶部:

variables:
  GIT_SSL_NO_VERIFY: "1"

将GitLab-Runner指向正确的证书

official documentation所述,您可以使用 tls-*-file 选项设置证书,例如:

[[runners]]
  ...
  tls-ca-file = "/etc/gitlab-runner/ssl/ca-bundle.crt"
  [runners.docker]
  ...

documentation所述,“每次当跑步者尝试访问GitLab服务器时,都会读取此文件。”

如果需要,其他选项包括tls-cert-file来定义要使用的证书。

答案 1 :(得分:3)

虽然我仍然没有为什么不能立即使用,我已经找到了哥伦布的蛋

Gitlab-Runner 配置:

[[runners]]
  name = "MyDockerServer-Runner"
  url = "https://MY_PRIVATE_REPO_URL_HERE/"
  token = "MY_TOKEN_HERE"
  executor = "docker"
  ...
  [runners.docker]
    image = "ubuntu:latest"

  # The trick is the following:
    volumes = ["/cache","/srv/gitlab-runner/config:/etc/gitlab-runner"]
    ...

Gitlab-ci.yml 管道:

MyJob:
    image: ubuntu:latest

    script:
      - awk -v cmd='openssl x509 -noout -subject' '/BEGIN/{close(cmd)};{print | cmd}' < /etc/ssl/certs/ca-certificates.crt
      - git clone https://gitlab-ci-token:${CI_BUILD_TOKEN}@ServerA/foo/bar/My-Project.wiki.git
      - wget -O foo.png https://ServerA/foo/bar/foo.png 

    before_script:
      - apt-get update -y >/dev/null
      - apt-get install -y apt-utils dialog >/dev/null
      - apt-get install -y git >/dev/null
      - apt-get install -y wget >/dev/null

    # The trick is the following:
      - cp /etc/gitlab-runner/certs/ca.crt /usr/local/share/ca-certificates/ca.crt
      - update-ca-certificates

就是这样:

  • 一次安装卷(每个 Docker执行器
  • 一次更新CA证书(每个职位

一切都会按预期进行git clonewget https等...

一个很好的解决方法,直到GitLab上的某个人解决它或向我解释我错了(成为我的客人!)

答案 2 :(得分:1)

不确定这是最好的方法,但至少对我有用。您可以创建自定义的gitlab运行器映像,并将您的根CA添加到其中:

├── Dockerfile
└── myca.crt
# Dockerfile
FROM gitlab/gitlab-runner:latest
COPY myca.crt /usr/local/share/ca-certificates
RUN update-ca-certificates

构建它:

docker build -t custom-gitlab-runner .

并重新运行所有命令,只需记住使用此新图像名称即可。

离题,但相关并且可能有用

Dockerized gitlab-runner似乎也忽略了/etc/hosts中的条目,因此,如果您在自定义域上启动了Gitlab,例如https://gitlab.local.net,启动/注册gitlab运行程序时,您需要传递/etc/hosts中的值:

docker run -d --name gitlab-runner --restart always \
       --add-host="gitlab.local.net:192.168.1.100" \
       ...

如果您要启动 docker:dind (docker服务中的docker)容器来构建docker映像,则还需要在/srv/gitlab-runner/config/config.toml内设置以下值:

[[runners]]
  url = "https://gitlab.local.net/"
  executor = "docker"
  pre_clone_script = "echo '192.168.1.100 gitlab.local.net registry.local.net' >> /etc/hosts"
  ...

答案 3 :(得分:0)

从您提供的输出中,我认为证书可能还可以,但是您缺少CRL文件:server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none

CRL文件用于验证即使证书有效,也没有被CA所有者吊销。然后,您需要:

1)根据您的CA生成CRL文件:

openssl ca -gencrl -keyfile ca.key -cert ca.crt -out crl.pem

来源:https://blog.didierstevens.com/2013/05/08/howto-make-your-own-cert-and-revocation-list-with-openssl/

2)指示跑步者使用它:

[[runners]]
  ...
  tls-ca-file = "/etc/gitlab-runner/ssl/ca-bundle.crt"
  crl-file = "/etc/gitlab-runner/ssl/ca.crl"

3)当然设置GIT_SSL_NO_VERIFY也可以,但是您对中间人攻击更敏感