17

我已经安装并配置:

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

ServerA 证书由自定义 CA Root 生成

配置

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

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

如在容器中运行 GitLab Runner - Docker 映像安装和配置中所述,在ServerB上安装了 Runner :

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

按照注册 Runners - 单行注册命令中的说明注册Runner :

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 revision=cf91d5e1 version=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 根),但根据自签名证书或自定义证书颁发机构,第 n.1 点,它应该是开箱即用的:

默认值:GitLab Runner 读取系统证书存储并根据存储在 system 中的 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

4 回答 4

11

你有两个选择:

忽略 SSL 验证

把它放在你的顶部.gitlab-ci.yml

variables:
  GIT_SSL_NO_VERIFY: "1"

将 GitLab-Runner 指向正确的证书

官方文档中所述,您可以使用tls-*-file选项来设置您的证书,例如:

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

正如文档所述,“每次运行者尝试访问 GitLab 服务器时都会读取此文件。”

其他选项包括tls-cert-file在需要时定义要使用的证书。

于 2018-11-07T14:23:09.323 回答
7

虽然我仍然不明白为什么它不能开箱即用,但我发现了哥伦布的蛋

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 clone,,wget https等等......

一个很好的解决方法,直到 GitLab 的某个人修复它或向我解释我错在哪里(做我的客人!)

于 2018-11-20T10:54:49.337 回答
3

不确定这是最好的方法,但至少它对我有用。您可以创建一个自定义的 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,你需要/etc/hosts在启动/注册 gitlab runner 时传递值:

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

如果你想启动docker:dind(docker in docker service)容器来构建 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"
  ...
于 2019-02-20T23:03:02.207 回答
1

从您提供的输出中,我认为证书可能没问题,但您缺少 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会起作用,但你会对中间人攻击更敏感

于 2018-11-13T11:55:43.573 回答