Невозможно разрешить «невозможно получить сертификат локального эмитента» с помощью 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.