Вопрос или проблема
Я использую Ubuntu 12.04 и git 1.7.9.5.
Несколько дней назад git работал нормально. Похоже, что установка или конфигурация модуля passenger для apache2 изменила какой-то необходимый пакет или изменила файл, используемый одним из них, и теперь любые попытки выполнить git clone
заканчиваются:
error: gnutls_handshake() failed: A TLS packet with unexpected length was received. while accessing https://github.com/fnando/i18n-js.git/info/refs
fatal: HTTP request failed
Все ссылки, которые я могу найти на эту ошибку при попытке git clone
, устарели и, похоже, касаются ошибки в стандартной установке git. Я попытался выполнить шаги, описанные в https://bugs.launchpad.net/ubuntu/+source/pycurl/+bug/926548, но это не сработало; команда dpkg-source
не удалась, потому что pycurl_7.19.0-ubuntu3.dsc
не существует.
Я попытался удалить и переустановить несколько пакетов, включая git
, curl
, libcurl3-gnutls
и libcurl4-openssl-dev
, без изменений – git clone
по-прежнему завершается с этой же ошибкой.
На данный момент меня в первую очередь интересует восстановление использования git clone
(и любых других функций, которые в конечном итоге также будут работать неправильно из-за основного вопроса).
У меня была такая же проблема, и мне пришлось перекомпилировать git с использованием libcurl-openssl-v4 вместо gnutls. Это может иметь какое-то отношение к маршруту к git-серверу и неловкому поведению gnutls.
На этом сайте есть предыдущий пошаговый вариант решения, как сделать именно это, но у меня есть пара моментов, которые я сделал иначе, и с которыми столкнулся.
Во-первых, я не рекомендую использовать dpkg -i в качестве метода установки пакета, используйте gdebi из пакета gdebi-core, потому что это позволяет вам установить пакет и его зависимости.
Наиболее важно, что в этом решении не упоминается о том, что будет создано несколько *.deb пакетов, поэтому стоит использовать gdebi-core.
Во-вторых и напоследок, убедитесь, что сначала установите пакет git-man, а затем установите основной пакет и его зависимости, по какой-то причине основной пакет, указанный в этом решении, не устанавливается ни с помощью dpkg, ни с помощью gdebi без предварительной установки руководства.
Ответ или решение
Ошибка gnutls_handshake() failed: A TLS packet with unexpected length was received
может возникнуть по нескольким причинам, и, чтобы решить эту проблему, важно понимать как программное обеспечение взаимодействует друг с другом. Давайте рассмотрим возможные шаги для устранения этой ошибки в вашем окружении Ubuntu 12.04 с установленным Git версии 1.7.9.5.
1. Обновление системного ПО
Удаление и переустановка пакетов может помочь, но сначала следует проверить, нет ли доступных обновлений системы. Для этого выполните команду:
sudo apt-get update && sudo apt-get upgrade
Также рекомендуется проверить наличие более новых версий Git и cURL. На момент написания рекомендации поддержка Ubuntu 12.04 уже закончилась, и вам может потребоваться обновление до более актуальной версии Ubuntu (например, 20.04 или выше).
2. Переустановка зависимостей
Поскольку проблема может быть связана с библиотеками, используемыми Git, попробуйте переустановить следующие пакеты:
sudo apt-get install --reinstall git git-man curl libcurl3-gnutls libcurl4-openssl-dev
3. Сборка Git с поддержкой OpenSSL
Ваша проблема может быть связана с GnuTLS, который вызывает сбои из-за особенностей шифрования. Рассмотрим шаги по сборке Git с OpenSSL:
- Установка необходимых пакетов для сборки:
sudo apt-get install build-essential libssl-dev libcurl4-openssl-dev libexpat1-dev gettext
- Скачивание исходного кода Git:
wget https://github.com/git/git/archive/refs/tags/v2.xx.x.tar.gz
tar -xzf v2.xx.x.tar.gz
cd git-2.xx.x
Замените 2.xx.x
на последнюю стабильную версию Git.
- Сборка и установка Git:
make configure
./configure --with-curl --with-openssl
make all
sudo make install
4. Использование Gdebi для установки пакетов
Вы правильно упомянули использование gdebi
, который помогает установить пакеты и их зависимости автоматически. Если вы собираете пакеты из .deb:
sudo apt-get install gdebi-core
sudo gdebi имя_пакета.deb
5. Проверка конфигураций
Убедитесь, что у вас нет ошибок в конфигурациях Apache, связанных с модулем Passenger. Попробуйте временно отключить этот модуль и снова выполнить команду git clone
.
sudo a2dismod passenger
sudo service apache2 restart
6. Проверка сетевых настроек
Убедитесь в отсутствии проблем с сетью или фильтрацией на уровне сети, возможно, в организации или у провайдера возникает вмешательство в HTTPS трафик.
Заключение
Устранение ошибки gnutls_handshake failed
требует комплексного подхода и может зависеть от множества различных факторов в вашей системе. Следуя вышеизложенным шагам, вы сможете выявить и, в конечном итоге, решить проблему, восстанавливая доступность команд Git. Если проблема продолжает возникать даже после всех вышеуказанных шагов, может потребоваться профессиональная помощь для дальнейшего анализа состояния системы и выявления глубинных причин.