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


Answers:


422

TLDR:

hostname=XXX
port=443
trust_cert_file_location=`curl-config --ca`

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

长答案

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

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

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

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

但这仅用于测试,如“ SSL可与浏览器,wget和curl配合使用,但对git失败 ”所示,或在本博客文章中说明

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


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

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

(其中' yourserver.com是您的GitLab服务器名称YourHttpsGitlabPort,通常是https端口443

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

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

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

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

Findekano添加了评论

要确定的位置curl-ca-bundle.crt,可以使用以下命令

curl-config --ca

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

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

8
原始消息不指示将证书添加到何处吗?在我curl-config --ca返回的情况下/etc/ssl/certs/ca-certificates.crt,这是我必须添加证书的地方。除此之外,这个答案是第一个向我指出这个问题正确方向的信息
uli_1973

1
您如何找到git install文件夹?
巴尔加夫'16

1
@Bhargav,这取决于您的操作系统。在Linux上,您可以执行which git
VonC

3
我跑了curl-config --ca,但是什么也没退。
费尔南多·科斯塔

1
感谢您的提示-您救了我的一天。
Janne

219

注意:这对安全性有重大影响。

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

export GIT_SSL_NO_VERIFY=1

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


60
不要拒绝投票,因为这是您知道自己在做什么的一种解决方法。但是,在一般情况下,强烈建议不要这样做。
2014年

9
当您知道自己在做什么时,我不会说这是一种解决方法。当您知道自己在做什么时,应该将证书视为“有人入侵我们”而失败,而不是“哦,安全性说有人入侵了我们,猜想我们需要禁用安全性”。如果需要尽快推动某些事情,这充其量是权宜之计。
srcspider 2014年

1
通过导出以上标志,我得到以下error.error:RPC失败;结果= 22,HTTP代码= 403致命:远程端意外挂起错误:RPC失败;result = 22,HTTP代码= 403致命:远端意外挂起
Desu

7
只有为我工作git config --global http.sslverify false
Dinei

2
大。你节省了我的时间。
Sai prateek

146

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

要检查当前系统时间:

date -R

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

apt-get install ntp

5
这是我的问题。我的大学阻止了ntp数据包,这阻止了我的系统更新时间。配置好大学ntp服务器后,一切又恢复了。感谢您的提示!
凯尔2015年

3
这也是我遇到问题的原因,我使用的是日期错误的嵌入式设备!
Shervin Emami

这是我的证书问题。在发现问题出在未来的服务器时钟之前,我花了数小时研究各种解决方案。但是,这并没有帮助我获得Node.js的未来版本。:-(
Kevin Teljeur,2017年

1
@Katu不必git说,这是底层的SSL交换。Git内置SSL支持。
伊凡(Yvan)

1
我对此投票了10000次。...一直在寻找为什么它现在不能整整6个小时不工作了...服务器关闭了不到7分钟,这确实成功了...谢谢!
dGo,

66

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

git config --global http.sslverify "false"

43

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

sudo update-ca-certificates

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


2
在Linux mint 16中像魅力一样工作:)
greuze

您是指cert.pem还是cert.crt还是cert.pem.crt?
廖慕智GZ

1
cert.pem应该重命名为cert.pem.crt
Nikolay Ruban

34

检查您的系统时钟,

$ date

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

$ apt-get install ntp

时钟应自行同步。

最后,再次输入clone命令。


1
是! 我有一个Ubuntu实例在VirtualBox中挂了很长时间。我暂停时,由于任何原因系统时钟均未同步。VonC的答案似乎很有学问,但是我真的很高兴我不必运行一堆我不理解的安全命令。首先检查一下!
AndyJost

24
GIT_CURL_VERBOSE=1 git [clone|fetch]…

应该告诉您问题出在哪里。在我的情况下,它是由于卷曲时对NSS内置不支持PEM证书,由于NSS的支持不是主线(#726116 #804215 #402712 更多)。


4
不错的补充GIT_CURL_VERBOSE。我没有在回答中提及它。+1
VonC 2014年

18

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

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。


1
我不知道这是否对任何人都有效,但是我需要“ tee”将证书文件附加为root:echo -n | openssl s_client -showcerts -connect yourserver.com:443 2> / dev / null | sed -ne'/ -BEGIN CERTIFICATE-/,/-END CERTIFICATE- / p'| sudo tee -a /etc/ssl/certs/ca-certificates.crt
ywu

就我而言,服务器具有有效的证书,但是我的数据库不包含该证书,因此我解析了此命令,但必须指出,该命令必须以root特权运行。
hermeslm

10

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

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

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

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


8

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

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

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

无需运行update-ca-certificates

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

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


1
如果未对所有SSL CA链正确配置服务器,则可能导致相同的情况。
abcdef12

链问题可能是原因,如abcdef12所述。我在git 1.9.1中遇到了这个问题-服务器正在发送证书链:#0服务器证书;#1服务器证书(再次);#2签名者证书。链中的重复项是git不喜欢它的原因。
贾哈

8

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

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

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


该解决方案解决了我在Ubuntu 16.04中相同的问题。
user3072843 '19

证书块到底是什么意思?---BEGIN CERTIFICATE---和之间的方块--- END CERTIFICATE ---
B–rian

3

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

sudo apt-get install ntp

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


1

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

[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

1
最好使用命令行git config http.sslVerify false。您是否建议在每个存储库的基础上编辑Git配置,而不是@ romain-vdk建议的全局编辑?
ahogen

1

你应该检查的第一件事是的文件权限/etc/ssl/etc/ssl/certs

rm -rf /etc/ssl/*在使用ssl-cert我的证书颁发机构管理工具时,使用组名/ ID时我犯了放弃文件权限(或删除SSL 目录)的错误。

那时我注意到了wgetcurlCLI浏览器工具完全相同的错误消息:

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

一旦将/etc/ssland /etc/ssl/cert目录的文件权限设置为o+rx-w,这些CLI浏览器工具就会开始变得轻松一些:

mkdir -p /etc/ssl/certs
chmod u+rwx,go+rx /etc/ssl /etc/ssl/certs

我还必须重新创建Java子目录并重建Trusted CA证书目录:

mkdir /etc/ssl/certs/java
chmod u+rwx,go+rx /etc/ssl/certs/java
update-ca-certificates

海岸是晴朗的。


0

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


0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.