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):

Единственное различие, которое я вижу, заключается в том, что git, по-видимому, использует явный файл CA, а 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 по ssh (с гитолитом и без него).

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

Спасибо, что прочитали этот длинный пост!

Ответ 1

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

Ответ 2

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

Вы можете добавить промежуточный сертификат в файл ca-cert, как показано ниже:

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

git config http.sslcapath <path to CA directory>

ИЛИ

git config http.sslcainfo <path to CA cert>

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

Ответ 5

export GIT_SSL_NO_VERIFY = 1

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

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

Ответ 6

Проблема может заключаться в том, что вы не настроили правильно Apache

Возможно, вам придется добавить имя своего сервера в файл конфигурации Apache /etc/apache 2/sites-enabled/default-ssl.conf, например:

ServerName demo.personalserver.com

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