我已经安装并配置了:
服务器证书是由自定义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证书?
答案 0 :(得分:3)
您有两个选择:
将其放在您的.gitlab-ci.yml
顶部:
variables:
GIT_SSL_NO_VERIFY: "1"
如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
就是这样:
一切都会按预期进行:git clone
,wget 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
也可以,但是您对中间人攻击更敏感