SSL适用于浏览器,wget和curl,但是使用git失败

时间:2011-10-18 22:16:42

标签: apache git ssl redmine

我有一个网站,我用来托管redmine和几个git存储库

这适用于http,但我不能用https克隆,即

git clone http://mysite.com/git/test.git

工作正常,但

git clone https://mysite.com/git/test.git

失败

奇怪的是,https似乎适用于我测试过的所有其他内容。如果我打开

https://mysite.com/git/test.git

在浏览器中(在chrome和firefox中测试过),我没有收到任何错误或警告。我也可以

curl https://mysite.com/git/test.git
wget https://mysite.com/git/test.git

这两项工作都没有任何抱怨或警告。

以下是git的详细输出:

$ GIT_CURL_VERBOSE=1 git clone https://user@mysite.com/test/test.git
Cloning into test...
Password:
* Couldn't find host mysite.com in the .netrc file; using defaults
* About to connect() to mysite.com port 443 (#0)
*   Trying 127.0.0.1... * Connected to mysite.com (127.0.0.1) port 443 (#0)
* found 157 certificates in /etc/ssl/certs/ca-certificates.crt
* server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
* Closing connection #0
* Couldn't find host mysite.com in the .netrc file; using defaults
* About to connect() to mysite.com port 443 (#0)
*   Trying 127.0.0.1... * Connected to mysite.com (127.0.0.1) port 443 (#0)
* found 157 certificates in /etc/ssl/certs/ca-certificates.crt
* server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
* Closing connection #0
error: server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none while accessing https://user\
@mysite.com/test/test.git/info/refs

fatal: HTTP request failed

以下是curl的详细输出,个人信息已更改:

* About to connect() to mysite.com port 443 (#0)
*   Trying 127.0.0.1... connected
* Connected to mysite.com (127.0.0.1) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using DHE-RSA-AES256-SHA
* Server certificate:
*        subject: C=US; <... cut my certs info ...>
*        start date: 2011-10-18 00:00:00 GMT
*        expire date: 2013-10-17 23:59:59 GMT
*        subjectAltName: mysite.com matched
*        issuer: C=GB; ST=Greater Manchester; L=Salford; O=COMODO CA Limited; CN=COMODO High-Assurance Secure Server CA
*        SSL certificate verify ok.
> GET / HTTP/1.1
> User-Agent: curl/7.21.6 (x86_64-pc-linux-gnu) libcurl/7.21.6 OpenSSL/1.0.0e zlib/1.2.3.4 libidn/1.22 librtmp/2.3
> Host: mysite.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Tue, 18 Oct 2011 21:39:54 GMT
< Server: Apache/2.2.14 (Ubuntu)
< Last-Modified: Fri, 14 Oct 2011 03:20:01 GMT
< ETag: "8209c-87-4af39bb89ccac"
< Accept-Ranges: bytes
< Content-Length: 135
< Vary: Accept-Encoding
< Content-Type: text/html
< X-Pad: avoid browser bug
<
<p>Welcome to the mysite.com<p/>
* Connection #0 to host mysite.com left intact
* Closing connection #0
* SSLv3, TLS alert, Client hello (1):

我能看到的唯一区别是git似乎使用了显式的CAfile,而curl使用整个目录?我是ssl的新手(至少在管理员方面),所以我不确定这意味着什么,或者我如何配置git以与curl相同的方式工作。

我在Ubuntu 10.04上使用git 1.7.5.4和apache 2.2.14。我尝试从3个不同的Linux主机(包括服务器本身的另一个帐户)进行克隆,但没有任何作用。

我还使用openssl工具在服务器上验证我的证书:

$openssl verify -purpose sslserver -CAfile chain.crt signed.pem 
signed.pem: OK

这可能与错误https://bugs.maemo.org/show_bug.cgi?id=4953有关,但似乎有所不同,因为我没有在任何其他程序中收到任何警告或错误。

值得一提的是,我正在使用gitolite和redmine_git_hosting使用智能http通过https进行身份验证。我不认为这有任何问题,因为即使我只是在/ var / www中使用其他工作的裸仓库并直接访问它,问题仍然存在。此外,git over ssh(有和没有gitolite)也可以。

如果您知道可能出现的问题,或者您想了解更多信息,请与我们联系。我真的更喜欢让ssl正常工作,而不是强迫所有人在git中禁用证书检查,尽管这是当前的解决方法。

感谢您阅读这篇长篇文章!

6 个答案:

答案 0 :(得分:17)

事实证明这是一个gnuTLS问题。 gnuTLS是对订单敏感的,而openssl则不是。我在我的中间证书文件中重新订购了证书,问题就消失了

答案 1 :(得分:11)

XCondE的回答将解决这个问题,但关闭安全警告总是让人感觉不错。如果您在ubuntu框上运行,则问题可能是您的Web服务器的CA证书不在/etc/ssl/certs/ca-certificates.crt文件中。我遇到了一个托管在Web服务器上的git服务器,其中包含由www.incommon.org签名的SSL证书。

您可以将中间证书添加到您的ca-certificates文件中,如下所示:

wget http://cert.incommon.org/InCommonServerCA.crt
openssl x509 -inform DER -in InCommonServerCA.crt -out incommon.pem
cat /etc/ssl/certs/ca-certificates.crt incommon.pem > ca-certs2.crt
sudo cp /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt.bak
sudo cp ca-certs2.crt /etc/ssl/certs/ca-certificates.crt

对幕后发生的事情进行了很好的讨论: http://curl.haxx.se/docs/sslcerts.html

答案 2 :(得分:4)

我在使用其中一个Comodo PositiveSSL证书时遇到此错误,并且能够通过更改中间证书的顺序来修复它。

订购证书后,我收到了以下文件:

  • 根CA证书 - AddTrustExternalCARoot.crt
  • 中级CA证书 - COMODORSAAddTrustCA.crt
  • 中级CA证书 - COMODORSADomainValidationSecureServerCA.crt
  • PositiveSSL通配符证书 - STAR_mydomain_com.crt

最初,我向Nginx提供的.crt证书的顺序如下:

  • PositiveSSL通配符证书 - STAR_mydomain_com.crt
  • 中级CA证书 - COMODORSAAddTrustCA.crt
  • 中级CA证书 - COMODORSADomainValidationSecureServerCA.crt

但是,我颠倒了最后两个证书的顺序,Git不再引发验证错误。

答案 3 :(得分:2)

git使用gnutls来处理这个问题,这需要指定CA.这可以使用per-respository完成:

git config http.sslcapath <path to CA directory>

OR

git config http.sslcainfo <path to CA cert>

您也可以指定--system或--global。

答案 4 :(得分:0)

导出GIT_SSL_NO_VERIFY = 1

来自http://blog.breadncup.com/2011/06/09/skip-git-ssl-verification/

警告:正如有些人提到的,这会禁用验证,让您对安全问题感到不满。你不应该长期依赖它,但是,在紧要关头,它将完成工作。

答案 5 :(得分:0)

问题可能是你没有正确配置Apache

您可能必须将服务器名称添加到Apache配置文件中 /etc/apache2/sites-enabled/default-ssl.conf,例如:

ServerName demo.personalserver.com

来自:https://www.progclub.org/blog/2014/09/03/gnutls_handshake-failed-using-git/#comment-96924