我可以通过使用ssh的克隆项目推送,但它不工作时,我克隆项目与https。
它显示的错误信息是:
server certificate verification failed. CAfile: /etc/ssl/certs/cacertificates.crt CRLfile: none
我可以通过使用ssh的克隆项目推送,但它不工作时,我克隆项目与https。
它显示的错误信息是:
server certificate verification failed. CAfile: /etc/ssl/certs/cacertificates.crt CRLfile: none
当前回答
导致这个问题的另一个原因可能是你的生物钟可能走错了。证书是时间敏感的。
查询当前系统时间。
date -R
您可以考虑安装NTP以从全局NTP池自动将系统时间与可信的internet时间服务器同步。例如,在Debian/Ubuntu上安装:
apt-get install ntp
其他回答
我遇到了詹金斯的问题。当我更新证书时,我开始面临这个错误。
stderr fatal: unable to access server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt
所以我已经在下面的文件中添加了我的新证书:
/etc/ssl/certs/ca-certificates.crt
该文件的内容如下所示:
-----BEGIN CERTIFICATE-----
blahblha
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
blahblha
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
blahblha
-----END CERTIFICATE-----
只要在底部附上你的证书:
-----BEGIN CERTIFICATE-----
blahblha
-----END CERTIFICATE-----
我在老旧的Ubuntu 16.04和GitLab上也遇到了同样的问题(其他电脑运行得很好)。
这个问题实际上是Git内部使用的旧版本的gnutls库。这个旧的库对服务器端的证书顺序很敏感——这个问题中有更多信息。最终的解决方案很简单:
apt-get update
apt-get upgrade libgnutls*
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"
警告:正如gather的精彩回答中所指出的,这将添加所有证书,而不仅仅是根ca。 盲目地将所有(任何)证书添加到您的trustStore中而不进行尽职调查并不是最好的做法。
长回答
基本原因是您的计算机不相信对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设置,a在第4272期。
要获得证书(需要添加到curl-ca-bundle中)。CRT文件),输入a:
echo -n | openssl s_client -showcerts -connect yourserver.com:YourHttpsGitlabPort \
2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
(“yourserver.com”是你的GitLab服务器名,yourhttpgitlabport是https端口,通常是443)
要查看CA(证书颁发机构颁发者),输入a:
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在评论中建议在openssl命令中添加-servername选项,否则在Valeriy的情况下,命令不会显示www.github.com的certificate。
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
注意:这具有重大的安全影响。
打开终端,执行以下命令:
export GIT_SSL_NO_VERIFY=1
它为我工作,我使用Linux系统。
不幸的是,投票最多的答案是错误的。这样做会达到预期的效果,但原因却是错误的。
VonC回答中的命令将链中的所有证书添加到信任锚存储区。然而,这些证书不是信任锚(或者换句话说,根CA证书);它们是最终实体和中间CA证书。
TLS RFC 5246标准规定:
certificate_list 这是一个证书序列(链)。发送方的 证书必须排在列表的第一位。每一个之后 证书必须直接证明它之前的证书。因为 证书验证要求分发根密钥 独立地,指定根的自签名证书 证书颁发机构可以从链中省略 假设远端必须已经拥有它才能 在任何情况下都要验证它。
因此,VonC(和其他)命令很可能会添加所有错误的证书,而不是根CA。
终端实体或中间CA证书不是信任锚。这些证书可能会随着时间的推移而改变,在这种情况下,同样的问题将再次浮出水面。另外,如果最终实体证书由于某种原因被撤销,会发生什么?您的计算机很可能继续信任已撤销的证书-在实践中,确切的响应可能取决于所使用的加密库,因为标准中没有很好地定义,因此在实现中会有所变化。
The correct way to fix this would involve looking at the last certificate in the chain, confirming it is not a Root CA (as that may be sent by the server - see the RFC extract quoted above) and if that is the case, looking at the Issuer and potentially the AKI field to ascertain which Root CA issued this first intermediate CA certificate. Once the details have been worked out, you'll need to visit the repository of that Root CA and download (and verify the hash) of that certificate before downloading it. You should review the CP/CPS of this Root CA before deciding to install it in your trust-anchor store.
如果最后一个证书是根CA,则使用openssl x509…命令查看详细信息,然后在决定是否应该在信任锚存储区中安装该证书之前进行尽职调查。
不可能也不应该有执行上述操作的自动过程,因为在决定将信任锚添加到信任锚存储区之前,需要验证信任锚的来源。在盲目地安装它之前,问问自己为什么它不是ca-certificate包(或你的发行版的等效包)的一部分。
但是,运行如下命令将显示链中最后一个证书的主题和颁发者,这可能有助于您追踪丢失的根CA证书:
echo -n | openssl s_client -showcerts -servername www.github.com -connect www.github.com:443 2>/dev/null | tac | awk '/-END CERTIFICATE-/{f=1} f;/-BEGIN CERTIFICATE-/{exit}' | tac | openssl x509 -noout -subject -issuer
这(对我来说是2021年5月底)导致:
subject=C = US, O = "DigiCert, Inc.", CN = DigiCert High Assurance TLS Hybrid ECC SHA256 2020 CA1
issuer=C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA
从上面可以看出,服务器发送的是中间CA证书,而不是根证书(主题和颁发者不同)。该中间CA证书是由DigiCert的高保证EV根CA签署的。我们现在可以访问DigiCert的存储库并下载该特定证书。
在安装该证书之前,通过运行openssl x509 -noout -text -in < downloads .crt,确保它是签署了中间CA的证书。pem>,并将X509v3授权密钥标识符扩展的值与服务器发送的证书中的相同扩展进行比较。注意:您可以通过将上一条命令末尾的-subject -issuer更改为-text来查看服务器发送的中间CA证书上的扩展名。
一旦你确定你下载的根CA证书是正确的,并且你已经进行了尽职调查并决定信任这个根CA,将它添加到你的信任锚存储区:
sudo mv <downloaded.crt.pem> /usr/local/share/ca-certificates/<downloaded.crt>
sudo update-ca-certificates
注意,该文件必须是PEM格式,文件名必须以.crt结尾,否则update-ca-certificates将无法识别它。