Ответ 1
Оказывается, это проблема gnuTLS. gnuTLS чувствителен к порядку, а openssl - нет. Я повторно заказал сертификаты в моем промежуточном файле cert и проблема исчезла.
У меня есть веб-сайт, который я использую для размещения 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, хотя это текущее обходное решение.
Спасибо, что прочитали этот длинный пост!
Оказывается, это проблема gnuTLS. gnuTLS чувствителен к порядку, а openssl - нет. Я повторно заказал сертификаты в моем промежуточном файле cert и проблема исчезла.
Ответ 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
Я столкнулся с этой ошибкой с одним из моих сертификатов Comodo PositiveSSL и смог исправить ее, изменив порядок промежуточных сертификатов.
После заказа сертификата мне были предоставлены следующие файлы:
Первоначально порядок сертификатов в .crt
, который я предоставлял Nginx, был следующим:
Однако я отменил порядок последних двух сертификатов, а Git больше не вызывает ошибки проверки.
git использует gnutls для этого материала, для которого требуется указать CA. Это можно сделать с помощью каждого репозитория с помощью:
git config http.sslcapath <path to CA directory>
ИЛИ
git config http.sslcainfo <path to CA cert>
Вы также можете указать --system или --global.
export GIT_SSL_NO_VERIFY = 1
Из http://blog.breadncup.com/2011/06/09/skip-git-ssl-verification/
ПРЕДУПРЕЖДЕНИЕ: как отмечали некоторые люди, это отключает проверку, оставляя вас открытым для решения проблем безопасности. Вы не должны полагаться на это долговременно, но, в крайнем случае, он выполнит свою работу.
Проблема может заключаться в том, что вы не настроили правильно 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