web-dev-qa-db-ja.com

SSLはブラウザ、wget、curlで動作しますが、gitでは失敗します

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://[email protected]/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):

私が見ることができる唯一の違いは、curlがディレクトリ全体を使用するのに対して、gitは明示的なCAfileを使用しているように見えるということです。私はsslを初めて使用するので(少なくとも管理者側では)、これが何を意味するのか、またはcurlと同じように動作するようにgitを構成する方法がわかりません。

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=495 しかし、他のプログラムで警告やエラーが発生していないため、状況は異なります。

私がgitoliteを使用していて、 redmine_git_hosting スマートhttpを使用してhttps経由の認証を行っていることは、言及する価値があるかもしれません。/var/wwwに他の方法で動作している裸のリポジトリを貼り付けて直接アクセスしても問題が存在するため、これは問題ではないと思います。また、git over ssh(gitoliteあり/なし)が機能します。

何か問題があるかもしれない場合や、さらに詳しい情報が必要な場合は、お知らせください。私は本当にsslを適切に動作させることを望んでいます。現在の回避策ですが、gitで証明書のチェックを無効にすることを全員に強制するのではなく。

この長い投稿を読んでくれてありがとう!

23
stokastic

これはgnuTLSの問題であることがわかりました。 gnuTLSは順序に依存していますが、opensslはそうではありません。中間証明書ファイルの証明書を並べ替えたところ、問題は解消しました

17
stokastic

XCondEの答えは問題に対処しますが、セキュリティ警告をオフにすることは常に悪い考えのように感じます。 ubuntuボックスで実行している場合、WebサーバーのCA証明書が/etc/ssl/certs/ca-certificates.crtファイルにないことが問題である可能性があります。私は、www.incommon.orgによって署名されたSSL証明書を持つWebサーバーでホストされているgitサーバーでこれに遭遇しました。

次のように、中間証明書を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

11
Pete Clark

Comodo PositiveSSL証明書の1つでこのエラーが発生し、中間証明書の順序を変更することで修正できました。

証明書を注文した後、次のファイルが提供されました。

  • ルート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

ただし、最後の2つの証明書の順序を逆にしたため、Gitは検証エラーをスローしなくなりました。

4
Nathan Osman

gitはこのためにgnutlsを使用しますが、CAを指定する必要があります。これは、リポジトリごとに次のように実行できます。

git config http.sslcapath <path to CA directory>

OR

git config http.sslcainfo <path to CA cert>

--systemまたは--globalも指定できます。

2

エクスポートGIT_SSL_NO_VERIFY = 1

From http://blog.breadncup.com/2011/06/09/skip-git-ssl-verification/ から

警告:一部の人が述べたように、これにより検証が無効になり、セキュリティの問題に対処できるようになります。あなたは長期的にそれに依存するべきではありませんが、ピンチで、それは仕事を成し遂げるでしょう。

1
Thiago Figueiro

問題は、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

0
FrankPak