SSL работает с браузером, wget и curl, но не работает с git - PullRequest
22 голосов
/ 19 октября 2011

У меня есть веб-сайт, который я использую для размещения 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.

Я использую git 1.7.5.4 и apache 2.2.14 на Ubuntu 10.04.Я попытался клонировать с 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 , используя smart http для аутентификации через https.Я не думаю, что в этом есть какая-то ошибка, потому что проблема существует, даже если я просто вставляю работающее в противном случае голое хранилище в / var / www и получаю к нему доступ напрямую.Кроме того, git over ssh (с gitolite и без него) работает.

Пожалуйста, дайте мне знать, если у вас есть идеи, что может быть не так или вам нужна дополнительная информация.Я действительно предпочел бы, чтобы ssl работал должным образом, а не заставлял всех отключать проверку сертификатов в git, хотя это обходной путь.

Спасибо за чтение этого длинного поста!

Ответы [ 6 ]

17 голосов
/ 16 мая 2013

Оказывается, это была проблема gnuTLS. gnuTLS чувствителен к порядку, а openssl - нет. Я переупорядочил сертификаты в моем промежуточном файле сертификата, и проблема исчезла

11 голосов
/ 21 августа 2012

Ответ XCondE решит проблему, но отключение предупреждений безопасности всегда кажется плохой идеей. Если вы работаете в Ubuntu Box, проблема может заключаться в том, что сертификат CA для вашего веб-сервера отсутствует в файле /etc/ssl/certs/ca-certificates.crt. Я столкнулся с этим с помощью git-сервера, размещенного на веб-сервере с SSL-сертификатом, подписанным www.incommon.org.

Вы можете добавить промежуточный сертификат в файл 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

4 голосов
/ 04 декабря 2014

Я столкнулся с этой ошибкой с одним из моих сертификатов Comodo PositiveSSL и смог исправить ее, изменив порядок промежуточных сертификатов.

После заказа сертификата мне были предоставлены следующие файлы:

  • Сертификат корневого CA - AddTrustExternalCARoot.crt
  • Промежуточный сертификат CA - COMODORSAAddTrustCA.crt
  • Промежуточный сертификат CA - COMODORSADomainValidationSecureServerCA.crt * Позитивный * Сертификат

Изначально порядок сертификатов в .crt, который я предоставлял Nginx, был следующим:

  • Сертификат с подстановочными знаками PositiveSSL - STAR_mydomain_com.crt
  • Промежуточный сертификат CA - COMODORSAAddTrustCA.crt
  • Промежуточный сертификат CA - COMODORSADomainValidationSecureServerCA.crt

Однако я изменил порядок последних двух сертификатов, и Git больше не выдает подтверждениеошибки.

2 голосов
/ 15 мая 2013

git использует gnutls для этого, что требует указания CA. Это можно сделать с помощью per-respository с помощью:

git config http.sslcapath <path to CA directory>

OR

git config http.sslcainfo <path to CA cert>

Вы также можете указать --system или --global.

0 голосов
/ 09 марта 2015

Возможно, проблема в том, что вы неправильно настроили 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 голосов
/ 25 января 2012

экспорт GIT_SSL_NO_VERIFY = 1

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

ВНИМАНИЕ: как упоминали некоторые люди, это отключает проверку, оставляя вас открытыми для множества проблем безопасности. Вы не должны полагаться на это в долгосрочной перспективе, но, в крайнем случае, оно выполнит свою работу.

...