Неможливо вирішити "не в змозі отримати сертифікат місцевого емітента" за допомогою git в Windows з самопідписаним сертифікатом


283

Я використовую Git у Windows. Я встановив пакет msysGit. У моєму тестовому сховищі на сервері є самопідписаний сертифікат. Я можу без проблем отримати доступ до репозиторію та використовувати його за допомогою HTTP. Перехід до HTTPS видає помилку:

Проблема з сертифікатом SSL: неможливо отримати сертифікат місцевого емітента.

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

У цьому дописі в блозі Філіпа Келлі було пояснено, що cURL не використовує магазин сертифікатів клієнтської машини. Я дотримувався поради в блозі, щоб створити приватну копію curl-ca-bundle.crtта налаштувати Git для її використання. Я впевнений, що Git використовує мою копію. Якщо я перейменую копію; Git скаржиться, що файл відсутній.

Я вставив свій сертифікат, як згадувалося в дописі в блозі, я все одно отримую повідомлення "не в змозі отримати сертифікат місцевого емітента".

Я переконався, що Git все ще працює, клонувавши GitHub-сховище через HTTPS.

Єдине, що я бачу, що це відрізняється від публікації в блозі, - це те, що мій сертифікат - корінь - немає ланцюга, щоб досягти цього. Мій сертифікат спочатку з’явився, натиснувши посилання IIS8 IIS Manager «Створити самопідписаний сертифікат». Можливо, це робить сертифікат певним чином відмінним від того, що очікує CURL.

Як я можу змусити Git / cURL прийняти самопідписаний сертифікат?



1
Також перевірте, чи дозволено вашій локальній мережі пересилати файли до сховища github. Можливо, є певне брандмауер або антивірусне обмеження.
shasi kanth

Якщо хтось стикається з цією помилкою під час використання 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 на довіру до конкретного сертифіката, який вам потрібен.
dsh

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

Якщо ви використовуєте Gitblit, то жодного іншого варіанту замість того, щоб робити sshVerify false.
Самір

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

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

153

Проблема полягає в тому, що 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 anmore, оскільки https простіше конфігурувати і, швидше за все, блокувати брандмауер, це означає менший шанс виходу з ладу.


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

94

У мене теж було це питання. У моєму випадку я намагався отримати гак Git після отримання, щоб оновлювати робочу копію на сервері з кожним натисканням. Намагався слідувати вказівкам у блозі, до якого ви пов’язали. Не працювало і для мене, і переосмислення налаштувань на основі кожного користувача теж не працювало.

Що мені довелося зробити - це відключити перевірку SSL (як згадується у статті) для Git в цілому. Не ідеальне рішення, але воно буде працювати, поки я не зможу розібратися з кращим.

Я відредагував текстовий файл конфігурації Git (з моїм улюбленим нейтральним додатком, таким як Notepad ++), який знаходиться за адресою:

C: \ програмні файли (x86) \ Git \ тощо \ gitconfig

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

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

Це зробило трюк.

ПРИМІТКА:

  • Це вимикає перевірку SSL і не рекомендується як довгострокове рішення.

  • Ви можете вимкнути це сховище, яке все ще не є великим, але локалізує налаштування.

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


145
Це перемагає мету SSL.
сяз

49
ви можете скористатися командою "git config --global http.sslВідтвердити помилкове", щоб відключити перевірку SSL
CleanCoder

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

35
Для одноразової команди не потрібно змінювати конфігураційні файли:git -c http.sslVerify=false clone https://...
пт

8
Краще виправити тут: blogs.msdn.microsoft.com/phkelley/2014/01/20/…
Warren P

51

kiddailey Я думаю, що це було досить близько, проте я б не відключив перевірку ssl, а скоріше просто надав локальний сертифікат:

У конфігураційному файлі Git

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

Або за допомогою командного рядка:

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

7
Що стосується вікон, це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
Anish

Місце мого сертифіката на mac: ~ / macports / share / curl / curl-ca-bundle.crt
користувач3282611

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.
Ian Kemp

Використовується це для SourceTree Atlassian. Встановлена ​​пакетна установка GIT знаходиться у% userprofile% \ appdata \ local \ attlassian \ sourcetree \ git_local. curl-ca-bundle.crt вже існував, додав до моєї base64 закодований експортований корінь cert.
Xanothos

40

Відповідь на це запитання, використовуючи makecert for Development SSL, вирішив це для мене.

Я не знаю чому, але сертифікат, створений простим посиланням "Створити самопідписаний сертифікат" у IIS Manager, не робить цього. Я дотримувався підходу в пов'язаному питанні про створення та встановлення самопідписаного кореневого СА; потім використовуючи це для видачі сертифіката автентифікації сервера для мого сервера. Я встановив їх обох у IIS.

Це отримує мою ситуацію так само, як повідомлення в блозі, на яке посилалося в оригінальному запитанні. Як тільки кореневий сертифікат був скопійований / вставлений у curl-ca-bundle.crt, комбінація git / curl була задоволена.


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

Це працювало для мене, але я тимчасово повісив на "я встановив їх обох у IIS". Щоб уточнити для інших ... серт cert призначається в IIS, а кореневий CA потрібно імпортувати до "Довірених кореневих органів сертифікації" через утиліту менеджера cert 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 repo.
Уес Тернер

19

У мене була та сама проблема, але з використанням sourcetree у Windows Ті ж кроки для звичайного GIT в Windows. Виконуючи наступні кроки, я зміг вирішити це питання.

  1. Отримання дерева сертифікатів сервера Це можна зробити за допомогою chrome. Перейдіть до адреси сервера. Клацніть на значку висячого замка та перегляньте сертифікати. Експортуйте весь ланцюжок сертифікатів у формат файлів, кодованих base64 (PEM).
  2. Додайте сертифікати до ланцюжка довіри вашого файлу конфігурації довіри GIT Запустіть "git config --list". знайдіть конфігурацію "http.sslcainfo", яка показує, де знаходиться файл довіри сертифіката. Скопіюйте всі сертифікати у файл ланцюжка довіри, включаючи "- -BEGIN- -" та "- -END- -".
  3. Переконайтеся, що ви додали всю ланцюжок сертифікатів у файл сертифікатів

Це має вирішити вашу проблему із самопідписаними сертифікатами та використанням GIT.

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

Якщо це системний GIT, ви можете використовувати параметри на вкладці TOOLS -> options GIt, щоб використовувати системний GIT, і це також вирішує проблему в sourcetree.


2
"якби я не включив увесь ланцюжок у файл сертифікатів, то це також буде невдалим" - я просто натрапив на цю проблему
Амані Кілуманга

Що стосується всього ланцюга, я маю два серти над вершиною github. Чи включати я їх до того, як root-> next cert-> github cert у файлі sslcainfo.crt?
Джекомс

Мені вдалося отримати доступ до пакетів git repo, просто додавши кореневий пакет.
Jecoms

Для майбутніх читачів. Поняття не має, якщо це має значення, але я поклав "root" (верхній) cert в кінець файлу (http.sslcainfo). І тоді, коли я відійшов від кореневої скриньки в ланцюжку, я поставив цей cert вище попереднього запису файлу (http.sslcainfo).
granadaCoder

11

У випадку сховищ github (або будь-яких непідписаних сертифікатів) , вибравши нижче під час встановлення Git-on-windows, було вирішено проблему.

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


1
Ви ніби відповіли на інше питання. Питання ОП стосувалося самопідписаних сертифікатів для клієнтів Windows.
jww

@jww назва питання - це повідомлення про помилку git, яке відображається, навіть якщо РЕПО НЕ власноруч підписує SSL!
Jawad Al Shaikh

Через це я перейшов помилку, але для доступу до 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" ~~). Не знали, що ви можете вказати місцезнаходження сертифіката лише для певного хоста. Туз!
Rocío García Luque

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

-5

Використовуйте цю команду перед запуском оновлення / встановлення композитора:

git config --global http.sslverify false
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.