Сообщение об ошибке
fatal: unable to access 'https://git.example.com/team/app.git/': server verification failed: certificate signer not trusted. (CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none)
Также выводится как
- server verification failed: certificate signer not trusted. (CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none)
- server certificate verification failed. CAfile: none CRLfile: none
URL в сообщении — адрес вашего удалённого репозитория. Старые выпуски Debian и Ubuntu (libcurl 7.x) выводят более короткое «server certificate verification failed. CAfile: none CRLfile: none», где «CAfile: none» означает лишь, что файл CA явно не задан и использовался системный пакет сертификатов.
Что это означает
HTTPS-транспорт git (libcurl, собранная с GnuTLS в Debian и Ubuntu) не смог проверить сертификат Git-сервера: ни один сертификат цепочки не ведёт к CA из пакета сертификатов, который он читает. «certificate signer not trusted» — так GnuTLS сообщает, что издатель неизвестен; ваши учётные данные и репозиторий ещё не проверялись.
Почему это происходит
Собственный GitLab, Gitea или Bitbucket с корпоративным сертификатом
частоСобственные Git-серверы часто получают сертификаты от внутреннего CA. На ноутбуках разработчиков этот корневой сертификат есть благодаря системе управления устройствами, а в Linux-контейнерах, CI-раннерах и дистрибутивах WSL его обычно нет.
Git-сервер не отправляет промежуточный сертификат
частоGitLab, Gitea и обратные прокси перед ними часто настроены так, что отдают только конечный сертификат. Браузеры восполняют пробел, а GnuTLS — нет.
Между вами и Git-хостом стоит прокси с инспекцией TLS
иногдаЕсли клонирование с github.com или gitlab.com не проходит только в корпоративной сети, соединения переподписывает прокси, чьего корневого сертификата нет в пакете сертификатов машины.
В образе нет пакета сертификатов CA
иногдаОблегчённый образ с установленным git, но без ca-certificates не может работать ни с одним удалённым репозиторием по HTTPS.
Как исправить
- 1.
Посмотрите, какие сертификаты отправляет Git-сервер
Если виден только конечный сертификат, исправьте сервер. Если цепочка заканчивается корневым сертификатом компании или прокси, установите этот корневой сертификат на клиенте.
bash openssl s_client -connect git.example.com:443 -servername git.example.com -showcerts </dev/null 2>/dev/null \ | grep -E '^ *[0-9]+ s:|^ *i:' - 2.
Добавьте доверие к CA только для одного Git-сервера
http.<url>.sslCAInfo ограничивает действие собственного CA одним хостом, так что публичные удалённые репозитории по-прежнему используют системный пакет сертификатов. GIT_SSL_CAINFO делает то же самое для одной команды или одного задания CI.
bash # Trust the company CA for this server only; other remotes keep the system bundle git config --global http."https://git.example.com/".sslCAInfo /etc/ssl/private-ca/corp-root-ca.pem git ls-remote https://git.example.com/team/app.git - 3.
Добавьте корневой сертификат в системный пакет сертификатов
Установка корневого сертификата через update-ca-certificates за один шаг исправляет git, curl, wget и менеджеры пакетов. В образах Docker делайте это в Dockerfile, в CI — в образе раннера.
bash sudo cp corp-root-ca.pem /usr/local/share/ca-certificates/corp-root-ca.crt sudo update-ca-certificates # git, curl and wget read /etc/ssl/certs/ca-certificates.crt - 4.
Владельцам серверов: настройте полную цепочку
Файл сертификата, который использует веб-фронтенд Git-сервера, должен содержать конечный сертификат, а за ним все промежуточные.
text # GitLab Omnibus (/etc/gitlab/gitlab.rb): the .crt file must contain leaf + intermediates nginx['ssl_certificate'] = "/etc/gitlab/ssl/git.example.com.crt" # then: sudo gitlab-ctl reconfigure - 5.
Временная диагностика: отключите проверку для одной команды
-c http.sslVerify=false для одной команды подтверждает, что проблема только в доверии. Если задать этот параметр глобально, ваши учётные данные и код получит любой, кто может перехватить соединение.
bash # Diagnostic only, for one command: never set http.sslVerify=false globally git -c http.sslVerify=false ls-remote https://git.example.com/team/app.git
Связанные ошибки
fatal: unable to access 'https://git.example.com/team/app.git/': SSL certificat…git over HTTPS with libcurl + OpenSSL (Git for Windows default, macOS Homebrew, Alpine, RHEL)fatal: unable to access 'https://git.example.com/team/app.git/': SSL certificat…git over HTTPS with libcurl + OpenSSL (Git for Windows default, macOS Homebrew, Alpine, RHEL)curl: (60) SSL certificate problem: unable to get local issuer certificatecurl (OpenSSL backend)ERROR: The certificate of 'api.example.com' is not trusted.GNU Wget built with GnuTLS (Debian, Ubuntu before 22.04 used it too)