Вопрос или проблема
Я пытаюсь выполнить hg pull --insecure
на ноутбуке с Mac OS X против hgweb Mercurial, работающего на веб-сервере Apache v2.
Я получаю ошибку на командной строке:
abort: could not set ciphers: No cipher can be selected.
(change cipher string (DEFAULT:@SECLEVEL=0) in config)
Моя версия Mercurial (hg): 6.8.1
, собранная из *.tar.gz “тарбола” с сайта SCM. Папка репозитория, в которую я тяну, скопирована в точности с машины win32, работающей под управлением TortoiseHg. Версия Python: Python 3.9.6
.
Моя версия Apache: Server version: Apache/2.4.62 (Debian)
. Соединение происходит через SSL. Я полагаю, что поддержка TLS в моей конфигурации Apache “почти по умолчанию” с самоподписанным сертификатом.
Когда я подключаюсь к Apache через FireFox, FireFox сообщает о поддержке TLS 1.3 в настройках безопасности. Однако я знаю, что OpenSSL Python, который используется в моих скриптах Mercurial, настроен только на поддержку TLS 1.2. (Я вижу это в файле sslutil.py
в архиве mercurial-6.8.1.tar.gz
)
Я могу успешно выполнять команды Mercurial hg
с помощью TortoiseHg на нескольких машинах MS Windows против того же веб-сервера hgweb.
Как я могу это исправить? Почему python не может провести сессию TLS 1.2 с моим веб-сервером Apache?
Ответ или решение
Проблема, с которой вы столкнулись, связана с несовместимостью между настройками шифрования в вашем клиенте Mercurial и сервере Apache. Давайте разберем все возможные аспекты, касающиеся этой ситуации, и предложим решение.
1. Понимание ошибки
Ошибка, которую вы видите:
abort: could not set ciphers: No cipher can be selected.
(change cipher string (DEFAULT:@SECLEVEL=0) in config)
указывает на то, что выбранное шифрование (cipher) не поддерживается текущими настройками OpenSSL в вашей версии Python, используемой Mercurial. Возможно, версии шифров, поддерживаемые вашим Python и OpenSSL, не соответствуют тем, которые предлагает сервер Apache.
2. Совместимость версий
На вашей машине установлены следующие версии:
- Mercurial: 6.8.1 (собранный из исходников)
- Python: 3.9.6
- Apache: 2.4.62 (Debian)
Согласно вашему описанию, Apache поддерживает TLS 1.3, что является наиболее современным протоколом. Python 3.9.6, вероятнее всего, поддерживает TLS 1.2, но использование OpenSSL, установленного на вашей системе, также может ограничивать версию протокола.
3. Проверка конфигураций
a. Конфигурация Apache
Убедитесь, что в файле конфигурации вашего Apache (обычно это /etc/apache2/sites-available/default-ssl.conf
или подобный) указаны корректные настройки для используемого протокола и шифрования. Например:
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5
Таким образом, вы исключите протоколы, которые могут быть небезопасными, и позаботитесь о наиболее надежных шифрах.
b. Проверка OpenSSL
Убедитесь, что версия OpenSSL, используемая вашим Python, поддерживает необходимые шифры и протоколы. Запустите следующую команду для проверки доступных шифров:
openssl ciphers -v
Это позволит вам увидеть, какие именно шифры доступны на вашей машине.
4. Настройка Mercurial
Вы можете добавить в конфигурацию Mercurial в .hgrc
(файл конфигурации Mercurial):
[web]
cacerts = /path/to/your/cacert.pem
ciphers = DEFAULT:@SECLEVEL=0
Эта инструкция изменит настройки шифрования, позволяя более гибко настраивать соединение.
5. Попробуйте использовать --insecure
Вы уже пробовали команду с параметром --insecure
. Этот параметр отключает проверку сертификата, и это может временно помочь вам установить соединение, однако не рекомендуется в продакшен-среде.
6. Обновление и репарация зависимостей
Если всё вышеуказанное не помогает, возможно, имеет смысл обновить OpenSSL и Python, чтобы исключить устаревшие и несовместимые библиотеки. Убедитесь, что используете последние стабильные версии, совместимые с вашими проектами.
Заключение
Ваша проблема связана с несовместимостью настроек шифрования между Mercurial и Apache. Проведите вышеупомянутые проверки и настройки, чтобы устранить проблему. Если проблема сохраняется, возможно, стоит рассмотреть обращение к сообществу Mercurial или этому проекту с конкретными логами и версиями используемого программного обеспечения.
Надеюсь, это поможет вам решить вашу проблему и наладить успешное соединение между Mercurial и вашим сервером Apache.