J'ai installé et configuré:
Le certificat ServerA est généré par une racine d'autorité de certification personnalisée.
J'ai mis le certificat racine de l'autorité de certification sur ServerB:
/srv/gitlab-runner/config/certs/ca.crt
Installation du Runner sur ServerB comme décrit dans Exécuter GitLab Runner dans un conteneur - Installation et configuration de l'image Docker :
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
Enregistré le coureur comme décrit dans Enregistrement des coureurs - Commande d'enregistrement sur une ligne :
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"
Cette commande a donné la sortie suivante:
Mise à jour des certificats CA ...
Plate-forme d'exécution Arch = AMD64 os = linux pid = 5 révision = cf91d5e1 version = 11.4.2
En cours d'exécution en mode système.Enregistrement du coureur ... coureur réussi = 8UtcUXCY
Le coureur s'est inscrit avec succès. N'hésitez pas à le démarrer, mais s'il fonctionne déjà, la configuration devrait être automatiquement rechargée!
J'ai vérifié avec
$ docker exec -it gitlab-runner bash
et une fois dans le conteneur avec
$ awk -v cmd='openssl x509 -noout -subject' '
/BEGIN/{close(cmd)};{print | cmd}' < /etc/ssl/certs/ca-certificates.crt
et la racine de l'autorité de certification personnalisée y est correctement.
Lors de l'exécution de Gitlab-Runner à partir de GitLab-CI, le pipeline échoue lamentablement en me disant que:
clone $ git https: // jeton gitlab-ci: $ {CI_BUILD_TOKEN} @ serveurA/foo/bar/mon-projet.wiki.git
Clonage dans 'My-Project.wiki' ...
fatal: impossible d'accéder ' https: // jeton gitlab-ci: xxxxxxxxxxxxxxxxxxx@ServerA/foo/bar/My-Project.wiki.git/ ': / vérification du certificat de serveur échouée. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: aucun
ERREUR: le travail a échoué: code de sortie 1
Il ne reconnaît pas l'émetteur (ma racine d'autorité de certification personnalisée), mais, selon les certificats auto-signés ou les autorités de certification personnalisées , point n.1, il devrait être livré immédiatement:
Valeur par défaut: GitLab Runner lit le magasin de certificats du système et vérifie le serveur GitLab par rapport aux autorités de certification stockées dans le système.
J'ai ensuite essayé la solution à partir du point n.3, édition
/srv/gitlab-runner/config/config.toml:
et en ajoutant:
[[runners]]
tls-ca-file = "/srv/gitlab-runner/config/certs/ca.crt"
Mais ça ne marche toujours pas.
Comment faire en sorte que Gitlab Runner lise le certificat CA Root?
Bien que je n'aie toujours pas pourquoi cela ne fonctionne pas immédiatement, j'ai trouvé l'œuf de Columbus :
Gitlab-Runner configuration:
[[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 pipeline:
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
C'est tout:
Et tout fonctionnera comme prévu : git clone
, wget https
, etc ...
Une excellente solution de contournement, jusqu'à ce que quelqu'un chez GitLab répare le problème ou m'explique où je me trompe (soyez mon invité!)
Pas sûr que ce soit la meilleure approche, mais au moins cela a fonctionné pour moi. Vous pouvez créer une image de coureur gitlab personnalisée et ajouter votre autorité de certification racine dans:
├── Dockerfile
└── myca.crt
# Dockerfile
FROM gitlab/gitlab-runner:latest
COPY myca.crt /usr/local/share/ca-certificates
RUN update-ca-certificates
Construit le:
docker build -t custom-gitlab-runner .
Et relancez toutes vos commandes. N'oubliez pas d'utiliser ce nouveau nom d'image.
Dockerized gitlab-runner semble également ignorer les entrées de votre /etc/hosts
. Par conséquent, si vous avez lancé Gitlab sur un domaine personnalisé, par exemple. https://gitlab.local.net
, vous devez passer les valeurs de /etc/hosts
lors du lancement/de l’enregistrement de gitlab runner:
docker run -d --name gitlab-runner --restart always \
--add-Host="gitlab.local.net:192.168.1.100" \
...
Si vous souhaitez lancer le conteneurdocker:dind
(docker dans le service Docker) pour créer des images de menu fixe, vous devez également définir ces valeurs dans /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"
...
Vous avez deux options:
Placez ceci en haut de votre .gitlab-ci.yml
:
variables:
GIT_SSL_NO_VERIFY: "1"
Comme indiqué dans la documentation officielle , vous pouvez utiliser les options tls - * - file pour configurer votre certificat, par exemple:
[[runners]]
...
tls-ca-file = "/etc/gitlab-runner/ssl/ca-bundle.crt"
[runners.docker]
...
Comme l'indique documentation , "ce fichier sera lu à chaque fois que le coureur tente d'accéder au serveur GitLab".
tls-cert-file
permet également de définir le certificat à utiliser si nécessaire.
D'après le résultat que vous avez fourni, je pense que le certificat pourrait être correct, mais que le fichier CRL manque: server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
Le fichier CRL est utilisé pour vérifier que même si le certificat est valide, il n'a pas été révoqué par le propriétaire de l'autorité de certification. Vous devez alors:
1) Générez un fichier CRL basé sur votre autorité de certification:
openssl ca -gencrl -keyfile ca.key -cert ca.crt -out crl.pem
source: https://blog.didierstevens.com/2013/05/08/howto-make-your-own-cert-and-revocation-list-with-openssl/
2) Demandez au coureur de l'utiliser:
[[runners]]
...
tls-ca-file = "/etc/gitlab-runner/ssl/ca-bundle.crt"
crl-file = "/etc/gitlab-runner/ssl/ca.crl"
3) Bien sûr, le paramétrage de GIT_SSL_NO_VERIFY
fonctionnera mais vous serez plus sensible aux attaques de type "man-in-the-middle"