gitlab-runner x509: certificate signed by unknown authority

myskies發表於2022-04-05

gitlab的單元測試依賴於gitlab-runnergitlab-runner的作用便是基本gitlab倉庫相關的配置來執行單元測試(包含但不限於)並把單元測試的結果反饋給gitlab

所以如果我們跑單元測試的環境是macos,則需要在一臺macos主機上安裝gitlab-runner;如果我們跑單元測試的環境是ubuntu,則需要在一臺ubuntu的主機上安裝gitlab-runner

gitlab-runner安裝完成後,需要將其註冊到gitlab中,這樣gitlab才會對其發起遠端的呼叫。註冊命令如下:

sudo gitlab-runner register --url https://yourGitLab.ServerDomainName.com --registration-token yourGitLabToken

但出於某些安全方面的原因,如果我們的gitlab伺服器的證書並不在擬執行單元測試主機的有效驗證範圍,則會報一個如下錯誤:

This solves the x509: certificate signed by unknown authority problem when registering a runner.

此時則需要我們在執行註冊命令時,手動的為其指定一個有效的證書。

解決方案

gitlab官網專門對這個問題進行了說明。大概就是說我們需要手動的為每個預註冊的站點來指定相關的證書。

https的訪問過程中,瀏覽器會自動的為我們下載證書並使用 CA 證書進行驗證,但gitlab-runner並不會如此,所以我們需要手動的幫助一下它。

雖然gitlab的官方給出了幾種解決方案,但實驗證明將下載到的證書註冊到作業系統上是最簡單的方案。

步驟如下:

獲取證書

如果跑gitlab服務的網站的證書就是你申請的,那麼你本身就擁有一個crt證書,可以略過此步,繼續往下看。

如果我們並不掌握當前站點的證書,則可以使用openssl來將獲取伺服器的crt證書,該操作可以在執行gitlab-runner的測試機上進行,也可以在自己的電腦上進行:

openssl s_client -showcerts -connect gitlab.example.com:443(修改為你自己的域名及埠) < /dev/null 2>/dev/null | openssl x509 -outform PEM > ~/gitlab.example.com.crt(修改為自己的名字)

總之呢,我們需要的是一個在gitlab站點上安裝的crt證書。

註冊證書

假設我們按上一步的操作拿到了相關站點的證書,並且上傳到了執行gitlab-runner的機器上。

ubuntu

下面,我們以ubuntu作業系統為例,介紹如何把這個證書全域性的安裝到作業系統。

yunzhi@yunzhi-virtual-machine:/etc/ca-certificates$ sudo apt-get install -y ca-certificates
[sudo] password for yunzhi: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
ca-certificates is already the newest version (20210119~20.04.2).
0 upgraded, 0 newly installed, 0 to remove and 160 not upgraded.
yunzhi@yunzhi-virtual-machine:~$ sudo cp gitlab.example.com.crt /usr/local/share/ca-certificates/
yunzhi@yunzhi-virtual-machine:/usr/local/share/ca-certificates$ sudo update-ca-certificates
Updating certificates in /etc/ssl/certs...
rehash: warning: skipping DigiCert-Global-Root-CA.pem,it does not contain exactly one certificate or CRL
1? added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.

?是關鍵,表示成功新增了1個證書。

freebsd

freebsd註冊證書比較簡單,只需要將crt檔案移到到/usr/local/share/certs/即可:

root@freebsd-jdk8:/home/panjie # cp yourdomain.crt /usr/local/share/certs/

註冊runner

證書新增完成後,便可以自動使用該證書完成註冊了:

yunzhi@yunzhi-virtual-machine:~$ sudo gitlab-runner register
Runtime platform                                    arch=amd64 os=linux pid=813430 revision=f188edd7 version=14.9.1
Running in system-mode.                            
                                                   
Enter the GitLab instance URL (for example, https://gitlab.com/):
https://gitlab.example.com:8888/
Enter the registration token:
yourGitLabTokenHere
Enter a description for the runner:
[yunzhi-virtual-machine]: ubuntu
Enter tags for the runner (comma-separated):

Enter optional maintenance note for the runner:
 
Registering runner... succeeded                     runner=GR134894
Enter an executor: docker-ssh+machine, kubernetes, custom, docker, parallels, ssh, docker-ssh, shell, virtualbox, docker+machine:

至此gitlab-runner x509:錯誤便被成功解決掉了。

註冊完成後,別忘了執行gitlab-runner start? 。

git clone

gitlab-runner在執行單元測試時,首要要執行git clone https://xxx操作,當我們的證書不被認可時(內部主機),還會出現如下錯誤:



fatal: unable to access 'https://xxxxx.xxx.xxx/yunzhic...': Problem with the SSL CA cert (path? access rights?)
fatal: unable to access 'https://xxx.xxx.xxx/yunzhiclu...': error setting certificate verify locations: CAfile: /home/gitlab-runner/builds/c_SqAx1t/0/yunzhiclub/smart-community.tmp/CI_SERVER_TLS_CA_FILE CApath: none


此時,則可以通過設定環境變數GIT_SSL_NO_VERIFY的值為true的方法來禁用git clone過程中的ssl校驗。

image.png

image.png

HTTPS原理和通訊流程
gitlab官網:Self-signed certificates or custom Certification Authorities
Ubuntu官方:Installing a root CA certificate in the trust store
禁用git的ssl校驗

相關文章