Невозможно разрешить «невозможно получить сертификат локального эмитента» с помощью git в Windows с самозаверяющим сертификатом


283

Я использую Git на Windows. Я установил пакет msysGit. Мой тестовый репозиторий имеет самозаверяющий сертификат на сервере. Я могу получить доступ и использовать репозиторий, используя HTTP без проблем. Переход на HTTPS дает ошибку:

Проблема с сертификатом SSL: невозможно получить сертификат локального эмитента.

У меня есть самозаверяющий сертификат, установленный в доверенных корневых центрах сертификации моего компьютера под управлением Windows 7 - client. Я могу перейти к URL-адресу репозитория HTTPS в Internet Explorer без сообщений об ошибках.

В этом сообщении в блоге Филиппа Келли объясняется, что cURL не использует хранилище сертификатов клиентского компьютера. Я последовал совету поста в блоге, чтобы создать личную копию curl-ca-bundle.crtи настроить Git для ее использования. Я уверен, что Git использует мою копию. Если я переименую копию; Git жалуется, что файл отсутствует.

Я вставил в свой сертификат, как уже упоминалось в сообщении в блоге, я все еще получаю сообщение «не удалось получить сертификат местного эмитента».

Я убедился, что Git все еще работает, клонировав репозиторий GitHub через HTTPS.

Единственное , что я вижу , что это отличается от блога в том , что мой сертификат является корневым - нет цепочки, чтобы добраться до него. Первоначально мой сертификат был получен после нажатия на ссылку IIS8 IIS Manager «Создать самоподписанный сертификат». Может быть, это каким-то образом отличает сертификат от того, что ожидает cURL.

Как я могу заставить Git / cURL принять самоподписанный сертификат?



1
Также проверьте, разрешено ли вашей локальной сети отправлять файлы в репозиторий github. Там могут быть некоторые ограничения брандмауэра или антивируса.
Шаси Кант

Если кто-то сталкивается с этой ошибкой при использовании Bower, создайте файл .bowerrc с содержимым { "strict-ssl": false }. Не благодари меня, поблагодари этого парня: stapp.space/fight-with-2 Я боролся с этой ошибкой почти 5 часов подряд!
Ганеш Джадхав

Ответы:


267

Откройте Git Bash и выполните команду, если вы хотите полностью отключить проверку SSL.

git config --global http.sslVerify false

Примечание. Это решение может открыть для вас атаки типа «человек посередине» . Поэтому снова включите проверку как можно скорее:

git config --global http.sslVerify true

70
Этот ответ наносит ущерб безопасности SSL, разрешая атаки «человек посередине». Другие ответы уже объясняют, как настроить git для доверия конкретному сертификату, который вам нужен.
дш

12
действительно ужасный ответ, вы даже не говорите им включить SSL. Вот почему происходят уязвимости в безопасности.
Эдгар Арутюнян

Если вы используете Gitblit, тогда никакой другой опции вместо sshVerify false.
Самир

24
Чтобы отключить проверку TLS / SSL для одной команды git, используйте следующую команду: git -c http.sslVerify=false clone https://domain.com/path/to/git
Максим Суслов

1
Ниже представлено несколько решений, и я уже предложил минусы. Так что вам решать, какие решения вы выбираете для решения проблемы.
Самир

154

Проблема в том, что git по умолчанию использует крипто-бэкэнд "Linux".

Начиная с Git для Windows 2.14, теперь вы можете настроить Git для использования SChannel, встроенного сетевого уровня Windows в качестве крипто-бэкэнда. Это означает, что вы будете использовать механизм хранения сертификатов Windows, и вам не нужно явно настраивать механизм хранения curl CA: https://msdn.microsoft.com/en-us/library/windows/desktop/aa380123(v= vs.85) .aspx

Просто выполните:

git config --global http.sslbackend schannel

Это должно помочь.

Использование schannel в настоящее время является стандартной установкой при установке git для windows, также рекомендуется по возможности не извлекать из хранилища SSH, так как https проще в настройке и с меньшей вероятностью будет заблокирован брандмауэром, что означает меньшую вероятность сбоя.


1
Однако обратите внимание, что это решение может git config --global http.sslCAInfo <my-server-self-signed-cert.pem>не работать. Я настроил http.sslCAInfoиспользование самозаверяющего сертификата для своего сервера, и по этой причине (может не совпадать с OP) я столкнулся с «проблемой SSL-сертификата: невозможно получить сертификат локального эмитента», когда я выполняю, например, a git clone https://github.com/Microsoft/vscode.git. Наконец, я использовал ответ от stackoverflow.com/a/47196562/1323552 (Бен П.П. Тунг), чтобы настроить мою конфигурацию sslCAInfo, специфичную для моего git-сервера, для ее решения.
Джонни Вонг

95

У меня тоже была эта проблема. В моем случае я пытался получить перехват Git после получения, чтобы обновлять рабочую копию на сервере при каждом нажатии. Пытался следовать инструкциям в блоге, на который вы ссылались. У меня это тоже не сработало и переопределение настроек для каждого пользователя тоже не сработало.

В итоге мне пришлось отключить проверку SSL (как упоминается в статье) для Git в целом. Не идеальное решение, но оно будет работать, пока я не найду лучшего.

Я отредактировал текстовый файл конфигурации Git (с моим любимым нейтральным приложением, заканчивающимся строкой, таким как Notepad ++), расположенный по адресу:

C: \ Program Files (x86) \ Git \ etc \ gitconfig

В блоке [http] я добавил опцию отключения sslVerify. Это выглядело так, когда я закончил:

[http]
    sslVerify = false
    sslCAinfo = /bin/curl-ca-bundle.crt

Это добилось цели.

НОТА:

  • Это отключает проверку SSL и не рекомендуется в качестве долгосрочного решения.

  • Вы можете отключить этот репозиторий, который все еще не очень хорош, но локализует настройки.

  • С появлением LetsEncrypt.org стало довольно просто, автоматизировано и бесплатно настроить SSL как альтернативу самозаверяющим сертификатам, что исключает необходимость отключения sslVerify.


145
Это противоречит цели SSL.
Сяз

49
вы можете использовать команду "git config --global http.sslVerify false", чтобы отключить проверку SSL
CleanCoder

6
Спасибо за указание sslCAinfoвхода в конфигурацию; но я не одобряю ответ, так как не имеет большого смысла постоянно отключать SSL для git для всей системы (пытались ли вы отключить его для всей системы, затем клонировать, затем снова включить, а затем отключить в локальный конфиг git для вновь клонированного репо?).
7heo.tk

35
Для одноразовой команды нет необходимости изменять конфигурационные файлы:git -c http.sslVerify=false clone https://...
pts

8
Лучше исправить это здесь: blogs.msdn.microsoft.com/phkelley/2014/01/20/…
Уоррен П

51

kiddailey, я думаю, был довольно близок, однако я бы не стал отключать ssl-проверку, а просто поставил бы локальный сертификат:

В конфигурационном файле Git

[http]
    sslCAinfo = /bin/curl-ca-bundle.crt

Или через командную строку:

git config --global http.sslCAinfo /bin/curl-ca-bundle.crt

7
На Git для Windows, этоgit config --global http.sslCAinfo /usr/ssl/certs/ca-bundle.crt
Карстен Тиннефельд

Или для меняgit config --global http.sslCAinfo /c/Program\ Files\ \(x86\)/Git/bin/curl-ca-bundle.crt
воробей

Для пользователей MacPorts этоgit config --global http.sslCAinfo /opt/local/share/curl/curl-ca-bundle.crt
miken32

3
С Git 2.8 вы можете использовать , git config --list --show-originчтобы увидеть , где http.sslCAinfo конфигурации установлен
Аниш

Расположение моего сертификата на Mac: ~ / macports / share / curl / curl-ca-bundle.crt
user3282611

47

Я тоже столкнулся с этой проблемой. И, наконец, решена, получив руководство из этого блога MSDN .

Обновить

На самом деле вам нужно добавить сертификат в файл сертификатов git curl-ca-bundel.cert, который находится в каталоге Git \ bin.

меры

  1. Откройте свою страницу github в браузере и нажмите на значок блокировки в адресной строке.
  2. В открывшемся небольшом всплывающем окне перейдите по ссылке «просмотреть сертификат», откроется всплывающее окно.
  3. В котором перейдите на вкладку сертификаты (3-й в моем случае). Выберите верхний узел, который является корневым сертификатом. И нажмите кнопку копирования сертификата внизу и сохраните файл.
  4. В проводнике перейдите в каталог Git \ bin и откройте curl-ca-bundle.crt в текстовом редакторе.
  5. Откройте экспортированный файл сертификата (на шаге 3) также в текстовом редакторе.
  6. Скопируйте весь контент из экспортированного сертификата в конец curl-ca-bundle.crt и сохраните.

Наконец, проверьте статус. Обратите внимание, что перед редактированием сделайте резервную копию файла curl-ca-bundle.crt, чтобы сохранить его в безопасности.


3
"перейдите в каталог Git \ bin и откройте curl-ca-bundle.crt" В git \ bin нет curl-ca-bundle.crt!
Антон К

@AntonK, если он не существует, создайте его самостоятельно в блокноте и переименуйте в curl-ca-bundle.crt. Другие шаги остаются такими же.
Надим Джамали,

16
@AntonK Он может называться просто ca-bundle.crtи находиться в mingw64\ssl\certsили mingw32\ssl\certs.
Ян Кемп

Использовал это для Atlassian's SourceTree. Связанная установка GIT находится в папке% userprofile% \ appdata \ local \ attlassian \ sourcetree \ git_local. curl-ca-bundle.crt уже существует, добавлен мой экспортированный корневой сертификат в кодировке base64.
Ксанотос

40

Ответ на этот вопрос Использование makecert для разработки SSL исправило это для меня.

Я не знаю почему, но сертификат, созданный простой ссылкой «Создать самоподписанный сертификат» в IIS Manager, не работает. Я следовал подходу в связанном вопросе создания и установки самоподписанного CA Root; затем с помощью этого выдать сертификат проверки подлинности сервера для моего сервера. Я установил их обоих в IIS.

Это объясняет мою ситуацию так же, как сообщение в блоге, на которое ссылается оригинальный вопрос. Как только корневой сертификат был скопирован / вставлен в curl-ca-bundle.crt, комбо git / curl было удовлетворено.


«Я не знаю, почему, но сертификат, созданный простой ссылкой« Создать самоподписанный сертификат »в IIS Manager, не справляется с задачей ...» - самое лучшее, что я могу сказать, это создание искаженных сертификатов. Существует множество правил при создании сертификатов X.509; «Сделай минимум, чтобы заставить его работать» больше не работает хорошо. Также см. Как вы подписываете запрос на подпись сертификата в своем центре сертификации и Как создать самозаверяющий сертификат с помощью openssl?
jww

Это сработало для меня, но я был временно зациклен на части «Я установил их обоих в IIS». Для подтверждения других ... серверный сертификат назначен в IIS, и корневой ЦС необходимо импортировать в «Доверенные корневые центры сертификации» с помощью утилиты диспетчера сертификатов Windows (certmgr.msc)
Филип

26

Чтобы избежать полного отключения проверки ssl или дублирования / взлома связанного файла сертификата CA, используемого git, вы можете экспортировать цепочку сертификатов хоста в файл и заставить ее использовать git:

git config --global http.https://the.host.com/.sslCAInfo c:/users/me/the.host.com.cer

Если это не работает, вы можете отключить проверку SSL только для хоста:

git config --global http.https://the.host.com/.sslVerify false

Примечание: Подвергается возможному нападению человека в середине, когда проверка SSL отключена.


4
Возможно, стоит отметить, что эта --globalопция не нужна: если вы ее опустите --global, эта настройка будет применяться только к этому конкретному git-репо.
Уэс Тернер

19

У меня только что была та же проблема, но с использованием sourcetree в Windows. Те же шаги для обычного GIT в Windows. После следующих шагов мне удалось решить эту проблему.

  1. Получить дерево сертификатов сервера. Это можно сделать с помощью Chrome. Перейдите к адресу сервера. Нажмите на значок замка и просмотрите сертификаты. Экспортируйте всю цепочку сертификатов в формате кодированных файлов base64 (PEM).
  2. Добавьте сертификаты в цепочку доверия вашего конфигурационного файла доверия GIT. Запустите «git config --list». найдите конфигурацию "http.sslcainfo", которая показывает, где находится файл доверия сертификата. Скопируйте все сертификаты в файл цепочки доверия, включая «-BEGIN-» и «-END- -».
  3. Убедитесь, что вы добавили всю цепочку сертификатов в файл сертификатов.

Это должно решить вашу проблему с самоподписанными сертификатами и использованием GIT.

Я попытался использовать конфигурацию "http.sslcapath", но это не сработало. Кроме того, если бы я не включил всю цепочку в файл сертификатов, то это также не получится. Если у кого-то есть указатели на них, пожалуйста, дайте мне знать, так как выше необходимо повторить для новой установки.

Если это системный GIT, то вы можете использовать параметры на вкладке ИНСТРУМЕНТЫ -> параметры GIt, чтобы использовать системный GIT, и это также решает проблему в sourcetree.


2
«Если бы я не включил всю цепочку в файл сертификатов, то это тоже не
сработало

Что касается всей цепочки, у меня есть два сертификата над сертификатом github. Нужно ли включать их по порядку как root-> next cert-> github cert в файл sslcainfo.crt?
Jecoms

Я смог получить доступ к пакетам git repo, просто добавив корневой сертификат.
Jecoms

Для будущих читателей. Не знаю, имеет ли это значение, но я поместил «корневой» (самый верхний) сертификат в конец файла (http.sslcainfo). И затем, когда я ушел от корневого сертификата в цепочке, я поместил этот сертификат выше предыдущей записи файла (http.sslcainfo).
granadaCoder

11

В случае с github Repositories (или любыми неподписанными сертификатами) , выбрав ниже при установке Git-on-windows, эта проблема была решена.

введите описание изображения здесь


1
Вы, кажется, ответили на другой вопрос. Вопрос ОП касался самоподписанных сертификатов на клиентах Windows.
jww

@jww заголовок вопроса - это сообщение об ошибке git, которое отображается, даже если репо НЕ является самозаверяющим SSL!
Джавад Аль Шейх

Это заставило меня пропустить ошибку, но для доступа к GitHub Enterprise потребовалось некоторое генерирование ключей и добавление открытых / закрытых ключей.
ΩmegaMan

1
Если самоподписанный сертификат был помещен в хранилище сертификатов Windows полезным администратором Windows через групповую политику, то этот ответ также является хорошим.
JamesD

7

У меня была эта проблема раньше, и решить ее с помощью следующего конфига.

[http "https://your.domain"] sslCAInfo=/path/to/your/domain/priviate-certificate

Начиная с git 2.3.1, вы можете поставить https://your.domainпосле http, чтобы указать, что следующий сертификат только для него.


1
Это самое простое и точное решение, которое я нашел, если вы также настроили его git config --global http.sslCAInfo <your-server-self-signed-cert.pem>ранее (следовательно, это вызвало ошибку «невозможно получить сертификат локального эмитента»)
Джонни Вонг

Это был правильный ответ на мою проблему (а не просто «отключение проверки SSL» ~~). Не знал, что вы можете указать местоположение сертификата только для конкретного хоста. Ace!
Росио Гарсия Луке

1
  1. Скачать сертификат можно по этой ссылке: https://github.com/bagder/ca-bundle
  2. Добавьте это к C:\Program Files\Git\bin иC:\Program Files\Git\mingw64\bin

Затем попробуйте что-то вроде: git clone https://github.com/heroku/node-js-getting-started.git


1

Одна вещь, которая меня испортила, была формат пути (на моем ПК с Windows). У меня изначально было это:

git config --global http.sslCAInfo C:\certs\cacert.pem

Но это не удалось из-за ошибки «невозможно получить сертификат локального эмитента».

Что в итоге сработало, так это:

git config --global http.sslCAInfo "C:\\certs\\cacert.pem"

1

В моем случае, поскольку я установил терминал ConEmu для Windows 7, он создает во ca-bundleвремя установки в C:\Program Files\Git\mingw64\ssl\certs.

Таким образом, я должен выполнить следующие команды на терминале, чтобы он работал:

$ git config --global http.sslbackend schannel
$ git config --global http.sslcainfo /mingw64/ssl/certs/ca-bundle.crt

Следовательно, мой C:\Program Files\Git\etc\gitconfigсодержит следующее:

[http]
    sslBackend = schannel
    sslCAinfo = /mingw64/ssl/certs/ca-bundle.crt

Также я выбрал ту же опцию, что и здесь, при установке Git.

Надеюсь, это поможет!


1

Устранить проблему с ошибкой SSL-сертификата: невозможно получить сертификат локального эмитента в git

У меня была такая же проблема с сертификатами Let's Encrypt.

Веб-сайт с https нам просто нужно:

SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

но git pull говорит:

fatal: unable to access 'https://example.com/git/demo.git/': SSL certificate problem: unable to get local issuer certificate

Чтобы это исправить, нам нужно также добавить:

SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.