服务器证书验证失败。 CAfile:/etc/ssl/certs/ca-certificates.crt CRLfile:无

server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none

我可以使用ssh推送克隆项目,但是当我使用https克隆项目时,它不起作用。

显示我的错误消息是:

1
server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none


TLDR:

1
2
3
4
5
6
7
hostname=XXX
port=443
trust_cert_file_location=`curl-config --ca`

sudo bash -c"echo -n | openssl s_client -showcerts -connect $hostname:$port \
    2>/dev/null  | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'  \
    >> $trust_cert_file_location"

长答案

主要原因是您的计算机不信任对Gitlab服务器上使用的证书进行签名的证书颁发机构。这并不意味着证书可疑,但是它可以是自签名的,也可以由不在您的操作系统的CA列表中的机构/公司签名。要避免计算机上的问题,必须做的就是告诉它信任该证书-如果您没有任何理由对此证书表示怀疑。

您需要检查用于gitLab服务器的Web证书,并将其添加到/bin/curl-ca-bundle.crt中。

要检查至少克隆是否可以正常工作而不检查所述证书,可以设置:

1
2
3
export GIT_SSL_NO_VERIFY=1
#or
git config --global http.sslverify false

但这仅用于测试,如" SSL可与浏览器,wget和curl配合使用,但与git配合使用"或本博客文章中所示。

检查您的GitLab设置(问题4272)。

要获取该证书(您需要将其添加到curl-ca-bundle.crt文件中),请键入:

1
2
echo -n | openssl s_client -showcerts -connect yourserver.com:YourHttpGilabPort \
  2>/dev/null  | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'

(以" yourserver.com"为您的GitLab服务器名称)

要检查CA(证书颁发机构颁发者),请键入:

1
2
3
echo -n | openssl s_client -showcerts -connect yourserver.com:YourHttpGilabPort \
  2>/dev/null  | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' \
  | openssl x509 -noout -text | grep"CA Issuers" | head -1

注意:Valeriy Katkov建议在注释中为openssl命令添加-servername选项,否则在Valeriy的情况下,该命令不会显示www.github.com的证书。

1
openssl s_client -showcerts -servername www.github.com -connect www.github.com:443

Findekano添加了评论:

to identify the location of curl-ca-bundle.crt, you could use the command

1
curl-config --ca

另外,请参阅我最近的答案" github:服务器证书验证失败":您可能必须放弃所有这些证书:

1
2
3
4
5
sudo apt-get install --reinstall ca-certificates
sudo mkdir /usr/local/share/ca-certificates/cacert.org
sudo wget -P /usr/local/share/ca-certificates/cacert.org http://www.cacert.org/certs/root.crt http://www.cacert.org/certs/class3.crt
sudo update-ca-certificates
git config --global http.sslCAinfo /etc/ssl/certs/ca-certificates.crt


Note: This has major security implications.

打开终端并运行以下命令:

1
export GIT_SSL_NO_VERIFY=1

它对我有用,我正在使用Linux系统。


造成此问题的另一个原因可能是您的时钟关闭了。证书是时间敏感的。

要检查当前系统时间:

1
date -R

您可能会考虑安装NTP,以自动将系统时间与全局NTP池中的受信任Internet时间服务器同步。例如,要在Debian / Ubuntu上安装:

1
apt-get install ntp


如果您在专用网络中使用git服务器,并且正在使用自签名证书或通过IP地址的证书;您也可以只使用git global config禁用ssl检查:

1
git config --global http.sslverify"false"

有同样的问题。由自我颁发的证书颁发机构引起。
通过将.pem文件添加到/ usr / local / share / ca-certificates /解决了该问题
并打电话

1
sudo update-ca-certificates

PS:文件夹./share/ca-certificates中的pem文件必须具有扩展名.crt


检查您的系统时钟,

$ date

如果不正确,证书检查将失败。要更正系统时钟,

$ apt-get install ntp

时钟应自行同步。

最后,再次输入clone命令。


1
GIT_CURL_VERBOSE=1 git [clone|fetch]…

应该告诉您问题出在哪里。在我的情况下,这是由于cURL针对NSS构建时不支持PEM证书,因为该支持不是NSS中的主线(#726116#804215#402712等)。


或者只是运行以下注释以将服务器证书添加到您的数据库中:

1
echo $(echo -n | openssl s_client -showcerts -connect yourserver.com:YourHttpGilabPort 2>/dev/null  | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p') >> /etc/ssl/certs/ca-certificates.crt

然后再次执行git clone。


设置goagent代理时,我弄乱了我的CA文件。无法从github提取数据,并得到相同的警告:

server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none

使用Vonc的方法,从github获取证书,然后将其放入/etc/ssl/certs/ca-certificates.crt,问题已解决。

echo -n | openssl s_client -showcerts -connect github.com:443 2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'


无需将git ssl验证设置为false。原因是系统没有所有的CA授权证书。通常,拥有真正SSL证书的人都缺少中间证书。

只需将中间证书的完整文本(缺少CA和中间证书的整个链)添加到

1
sudo gedit /etc/ssl/certs/ca-certificates.crt

无需运行update-ca-certificates即可工作。

手动生成的证书也是如此,只需添加CA证书文本。

最后:成功推送:一切都是最新的


我在Raspberry pi 2上安装了Xubuntu,发现时间上存在相同的问题,因为NTP和自动服务器同步已关闭(或未安装)。获取NTP

1
sudo apt-get install ntp

并将"时间和日期"从"手动"更改为"与Internet服务器保持同步"


我在终端中解决此问题的措施(Ubuntu 18.04):

1
openssl s_client -showcerts -servername www.github.com -connect www.github.com:443

我有两个证书块。然后,我将证书块复制到我的证书文件到/etc/ssl/certs/ca-certificates.crt


最终,将http.sslverify添加到您的.git / config中。

1
2
3
4
5
6
7
8
9
10
11
12
13
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote"origin"]
    url = https://server/user/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch"master"]
    remote = origin
    merge = refs/heads/master
[http]
        sslVerify = false

将证书和捆绑软件复制到一个.crt文件中,并确保文件中的证书之间没有空白行。

在尝试了Internet上的所有内容之后,这对我在GitLab服务器上起作用。


我刚刚在git存储库中遇到了同样的问题,它总是对我有用。问题是我通过公共WiFi访问访问了它,并在首次连接时重定向到了强制门户(例如,显示广告并同意tos)。