Git for Windows:SSL证书问题:证书已过期

103

我知道Let's Encrypt做了一些更改,可能会影响旧的客户端,因为根证书即将到期。请参见DST Root CA X3 Expiration (September 2021)

然而,我认为这不会影响我,因为我的开发机器是最新的。

但今天我在进行git pull时收到了此消息:

fatal: unable to access 'https://git.company.tld/project.git/': SSL certificate problem: certificate has expired

我刚刚下载了最新的Windows版Git(2.33.0),并确认内置的OpenSSL已经更新到最新版本(OpenSSL 1.1.1k 25 Mar 2021),应该是没有问题的。

适用于Let's Encrypt证书的OpenSSL客户端兼容性更改}

但错误似乎仍然存在。

openssl s_client -showcerts -connect git.company.tld:443

展示
CONNECTED(000001A0)
---
Certificate chain
 0 s:CN = git.company.tld
   i:C = US, O = Let's Encrypt, CN = R3
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
 1 s:C = US, O = Let's Encrypt, CN = R3
   i:O = Digital Signature Trust Co., CN = DST Root CA X3
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
---
Server certificate
subject=CN = git.company.tld

issuer=C = US, O = Let's Encrypt, CN = R3

---
No client certificate CA names sent
Peer signing digest: SHA512
Peer signature type: RSA
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 3058 bytes and written 443 bytes
Verification error: certificate has expired
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: ...
    Session-ID-ctx:
    Master-Key: ...
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1632982992
    Timeout   : 7200 (sec)
    Verify return code: 10 (certificate has expired)
    Extended master secret: no
---

问题并不在于证书本身,该证书未过期,并且被Chrome(Windows 证书存储)和Firefox接受。

这仍然是我的问题,未得到解答。我也在使用Let's Encrypt。 与此有关吗?https://stackoverflow.com/questions/69400588/phonegap-ajax-request-error-certificate-has-expired - dspillai
Git for Windows 2.33.0 应该可以正常运行。如果您已经将 sslCAInfo 设置为其他内容,请执行“git config -l | grep ssl”进行检查,确认其值是否为"C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.cr"。 - nharrer
2
在花费数小时尝试修复后,我放弃了:git config http.sslVerify false - michid
12个回答

63
在我的Ubuntu 16.04.6 LTS(Xenial Xerus)机器上,解决方案是通过运行以下两个命令来删除DST Root CA X3证书:
sudo rm /usr/share/ca-certificates/mozilla/DST_Root_CA_X3.crt
sudo update-ca-certificates

在我的 Mac OS X 10.13.6(High Sierra)机器上,cURL(因此 Git)依赖于 /etc/ssl/cert.pem 文件进行根 CA 验证。
解决方法是从该文件中删除今天过期的 DST Root CA X3 证书:
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            44:af:b0:80:d6:a3:27:ba:89:30:39:86:2e:f8:40:6b
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: O=Digital Signature Trust Co., CN=DST Root CA X3
        Validity
            Not Before: Sep 30 21:12:19 2000 GMT
            Not After : Sep 30 14:01:15 2021 GMT
        Subject: O=Digital Signature Trust Co., CN=DST Root CA X3
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:df:af:e9:97:50:08:83:57:b4:cc:62:65:f6:90:
                    82:ec:c7:d3:2c:6b:30:ca:5b:ec:d9:c3:7d:c7:40:
                    c1:18:14:8b:e0:e8:33:76:49:2a:e3:3f:21:49:93:
                    ac:4e:0e:af:3e:48:cb:65:ee:fc:d3:21:0f:65:d2:
                    2a:d9:32:8f:8c:e5:f7:77:b0:12:7b:b5:95:c0:89:
                    a3:a9:ba:ed:73:2e:7a:0c:06:32:83:a2:7e:8a:14:
                    30:cd:11:a0:e1:2a:38:b9:79:0a:31:fd:50:bd:80:
                    65:df:b7:51:63:83:c8:e2:88:61:ea:4b:61:81:ec:
                    52:6b:b9:a2:e2:4b:1a:28:9f:48:a3:9e:0c:da:09:
                    8e:3e:17:2e:1e:dd:20:df:5b:c6:2a:8a:ab:2e:bd:
                    70:ad:c5:0b:1a:25:90:74:72:c5:7b:6a:ab:34:d6:
                    30:89:ff:e5:68:13:7b:54:0b:c8:d6:ae:ec:5a:9c:
                    92:1e:3d:64:b3:8c:c6:df:bf:c9:41:70:ec:16:72:
                    d5:26:ec:38:55:39:43:d0:fc:fd:18:5c:40:f1:97:
                    eb:d5:9a:9b:8d:1d:ba:da:25:b9:c6:d8:df:c1:15:
                    02:3a:ab:da:6e:f1:3e:2e:f5:5c:08:9c:3c:d6:83:
                    69:e4:10:9b:19:2a:b6:29:57:e3:e5:3d:9b:9f:f0:
                    02:5d
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Key Usage: critical
                Certificate Sign, CRL Sign
            X509v3 Subject Key Identifier:
                C4:A7:B1:A4:7B:2C:71:FA:DB:E1:4B:90:75:FF:C4:15:60:85:89:10
    Signature Algorithm: sha1WithRSAEncryption
         a3:1a:2c:9b:17:00:5c:a9:1e:ee:28:66:37:3a:bf:83:c7:3f:
         4b:c3:09:a0:95:20:5d:e3:d9:59:44:d2:3e:0d:3e:bd:8a:4b:
         a0:74:1f:ce:10:82:9c:74:1a:1d:7e:98:1a:dd:cb:13:4b:b3:
         20:44:e4:91:e9:cc:fc:7d:a5:db:6a:e5:fe:e6:fd:e0:4e:dd:
         b7:00:3a:b5:70:49:af:f2:e5:eb:02:f1:d1:02:8b:19:cb:94:
         3a:5e:48:c4:18:1e:58:19:5f:1e:02:5a:f0:0c:f1:b1:ad:a9:
         dc:59:86:8b:6e:e9:91:f5:86:ca:fa:b9:66:33:aa:59:5b:ce:
         e2:a7:16:73:47:cb:2b:cc:99:b0:37:48:cf:e3:56:4b:f5:cf:
         0f:0c:72:32:87:c6:f0:44:bb:53:72:6d:43:f5:26:48:9a:52:
         67:b7:58:ab:fe:67:76:71:78:db:0d:a2:56:14:13:39:24:31:
         85:a2:a8:02:5a:30:47:e1:dd:50:07:bc:02:09:90:00:eb:64:
         63:60:9b:16:bc:88:c9:12:e6:d2:7d:91:8b:f9:3d:32:8d:65:
         b4:e9:7c:b1:57:76:ea:c5:b6:28:39:bf:15:65:1c:c8:f6:77:
         96:6a:0a:8d:77:0b:d8:91:0b:04:8e:07:db:29:b6:0a:ee:9d:
         82:35:35:10
-----BEGIN CERTIFICATE-----
MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
-----END CERTIFICATE-----

从文件中删除上面的整个代码片段并保存后,错误消失了。

我使用的是16.04.2版本,删除该文件并更新也没有帮助。我无法使用SSL在任何地方进行curl操作。 - Shautieh
谢谢,它在我的 macOS 10.15 上也能工作。 - mmerle
这对我的Mac真的有效,谢谢。 - Guntur Santoso

19

我曾经也遇到过同样的问题,因为我使用的是旧版本的Git for Windows(2.15.0)。将Git更新到最新版本(2.33)后,问题得以解决。

原因:较旧版本的Git无法接受来自Let's Encrypt过期的根证书。


15

我在一个Ubuntu 14.04 LTS(Trusty Tahr)服务器上遇到了同样的问题。

这个问题会影响到来自PHP等方面的cURL调用。

例如,从命令行上执行一个简单的curl

curl https://curl.se/ca/cacert.pem

我收到了证书过期的消息。这是由于旧的Let's Encrypt证书过期引起的。dst-root-ca-x3-expiration-september-2021

因此,这里有一个简单有效的解决方案:

编辑文件/etc/ca-certificates.conf

找到并注释掉带有!的行,如下所示:

!mozilla/DST_Root_CA_X3.crt

或者运行以下命令自动注释证书:

sudo sed -i -e 's/mozilla\/DST_Root_CA_X3\.crt/!mozilla\/DST_Root_CA_X3\.crt/g' /etc/ca-certificates.conf

保存文件

更新证书:

sudo update-ca-certificates

一切都完成了……它正在工作,没有必要改变其他东西……


嗨,谢谢,这个解决方案对于访问者连接的网站有什么缺点吗? - user2267379
@Christian Audebert非常感谢,你解决了我的烦恼。我曾经尝试手动删除/etc/ssl/certs/DST_Root_CA_X3.crt,但没有帮助,所以我又把它还原了。然后我又从/etc/ssl/ca-certificates.crt中删除了它,但也没有帮助(我的错,我应该执行这两个步骤来测试解决问题)。当然,正确的方法是编辑/etc/ca-certificates.conf,但我想保守地快速测试一下是否有帮助,而不进行update-ca-certificates更新。现在,通过终端和PHP脚本访问lets encrypt-ed网站的curl已经可以正常工作了 :) - mikep
@user2267379 这不会影响网站访问者,这个更改只针对作为客户端连接到 HTTPS 网站的服务器(例如使用 curl、wget 等工具)。 - mikep
@mekip:自从更改后,一些访问者无法连接到该网站,哪种解决方案适用于他们? - user2267379
“#!mozilla/DST_Root_CA_X3.crt” 是注释行,对吧?因为在我的文件中它已经是“!mozilla/DST_Root_CA_X3.crt”了。 - Shaho
显示剩余2条评论

13

在我们的Windows测试客户端上,我们需要将Git更新到最新版本。

自Git 2.16.1(2)以来,您可以使用

git update-git-for-windows

在版本2.14.2到2.16.1之间,该命令为

git update

另请参阅:如何在Windows上升级Git到最新版本


6

对于那些在Ubuntu上运行服务器且使用Certbot管理证书的用户,我已经强制更新使用ISRG Root X1进行续订。这样,新的证书不包含DST Root CA X3的链,这对我们很有帮助。

要做到这一点,首先检查您的Certbot版本是否为< 1:

sudo certbot --version

如果是这样,您需要将其删除并使用Snap重新安装:
sudo apt-get remove -y certbot python3-certbot-apache
sudo snap install certbot --classic
sudo ln -s /snap/bin/certbot /usr/bin/certbot

重新安装后,或者如果您的Certbot版本>1,则强制更新:

sudo certbot renew --force-renewal --preferred-chain "ISRG Root X1"

我还使用了 DigiCert SSL安装诊断工具 来检查我的证书,在续订前后进行验证,以确定是否已删除DST X3链。


1
非常感谢!对我的Ubuntu 14 Apache服务器完美地起作用。curl错误(错误60)现在已经消失了。 - paperboy

4

对于基于OpenSSL <= 1.0.2的应用程序,例如 Ubuntu 12.04(精准猛禽),您需要允许 OpenSSL 使用备用链路径来信任远程站点。

首先,您需要安装ISRG_Root_X1.crt证书,并从受信存储中删除过期的证书:DST_Root_CA_X3.crt

这将允许使用 OpenSSL 的客户端如WgetcURL等再次正常工作。操作步骤如下:

安装ISRG_Root_X1证书:

sudo wget http://launchpadlibrarian.net/482351465/ca-certificates_20190110~12.04.1_all.deb
sudo dpkg -i ca-certificates_20190110~12.04.1_all.deb

禁用 DST_Root_CA_X3 证书:

sudo vi /etc/ca-certificates.conf

然后设置:!mozilla/DST_Root_CA_X3.crt

注意:在此文件中,以#开头的行是注释。以!开头的行是要取消选择的证书文件名。

最后运行:

sudo update-ca-certificates

此后,wget和curl将不再抱怨。

我在那里找到的最好的解释是视频DST Root CAX3 Expiration Sept 2021(34分钟)。


"!"是什么?一个注释字符吗?用于注释掉(禁用)代码?你能澄清一下吗?请通过编辑(更改)您的答案来回复,而不是在评论中回复(不要添加“Edit:”,“Update:”或类似内容 - 答案应该看起来像今天编写的)。 - Peter Mortensen
所以将其更改为 #!mozilla/DST_Root_CA_X3.crt - Shaho
不要加上"#",只需输入"!"即可取消选择证书。 - frommelmak

4

显然,这不是客户端问题,而是由Sophos UTM WAF(最新版本9.707-5)提供的Let's Encrypt证书。

从Apache Web服务器提供的相同证书可以正常工作(openssl s_client -showcerts响应看起来不同->证书链中有更多条目)。因此,这不是与客户端相关的问题。

更新

解决方案是删除旧的Let's Encrypt CA(48:50:4E:97:...)。

CA

Web服务器保护证书管理证书颁发机构

客户端请求立即生效。

感谢Sophos论坛中的VolkerZier提供的提示。请参见(德语)Let's Encrypt根证书有效期至2021年9月30日(旧的R3 / X3证书链)


2
我遇到了 DevOps 构建代理的类似问题。但是我可以正常访问 DevOps 服务器的 Web 接口。
为了解决这个问题,
  • 我更新了 Let's Encrypt 客户端(我使用的是Certify The Web
  • 我更新了我的证书
之后,DevOps 代理就能够进行 Git 拉取操作了。

2

验证GnuTLSlibgnutls)的版本。备用链问题已在3.6.13-4中修复。因此,将GnuTLS更新到一个高于此版本的版本可能会解决Git的问题。

背景:

(至少对于Debian系统而言)curl / wget使用libssl / OpenSSL,而Git使用 libcurl3-gnutls 通过 libgnutls30


0

curl <url> -X POST -H 'authorization: Bearer xxx' [other option]

curl <url> -X POST -H 'authorization: Bearer xxx' [其他选项]

curl: (60) SSL certificate problem: certificate has expired
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

curl <url> -X POST -H 'authorization: Bearer xxx' [其他选项] -k

-k, --insecure

(TLS SFTP SCP) 默认情况下,curl 进行的每个安全连接在传输之前都会经过验证。此选项使 curl 跳过验证步骤并在不检查的情况下继续进行。curl/manpage


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接