Nie można rozwiązać problemu „nie można uzyskać lokalnego certyfikatu wystawcy” za pomocą git w systemie Windows z certyfikatem z podpisem własnym

283

Korzystam z Git w systemie Windows. Zainstalowałem pakiet msysGit. Moje repozytorium testowe ma samopodpisany certyfikat na serwerze. Mogę bez problemu uzyskiwać dostęp do repozytorium i korzystać z niego przy użyciu protokołu HTTP. Przejście na HTTPS powoduje błąd:

Problem z certyfikatem SSL: nie można uzyskać lokalnego certyfikatu wystawcy.

Mam samopodpisany certyfikat zainstalowany w Zaufanych głównych urzędach certyfikacji mojego komputera z systemem Windows 7. Mogę przeglądać adres URL repozytorium HTTPS w Internet Explorerze bez komunikatów o błędach.

W tym poście Philipa Kelleya wyjaśniono, że cURL nie używa magazynu certyfikatów komputera klienckiego. Postępowałem zgodnie z radą posta na blogu, aby utworzyć prywatną kopię curl-ca-bundle.crti skonfigurować Gita, aby z niej korzystał. Jestem pewien, że Git używa mojej kopii. Jeśli zmienię nazwę kopii; Git skarży się, że brakuje pliku.

Wkleiłem w certyfikacie, jak wspomniano w poście na blogu, nadal pojawia się komunikat „nie mogę uzyskać certyfikatu lokalnego wystawcy”.

Sprawdziłem, że Git nadal działa, klonując repozytorium GitHub za pośrednictwem HTTPS.

Jedyne, co widzę, różni się od posta na blogu, to to, że mój certyfikat jest katalogiem głównym - nie ma łańcucha, aby go osiągnąć. Mój certyfikat pierwotnie pochodził z kliknięcia linku Menedżer IIS8 IIS „Utwórz certyfikat z podpisem własnym”. Może to sprawia, że ​​certyfikat różni się w pewien sposób od tego, czego oczekuje cURL.

Jak mogę zmusić Git / cURL do zaakceptowania samopodpisanego certyfikatu?

RichardHowells
źródło
1
Sprawdź także, czy Twoja sieć lokalna może przesyłać pliki do repozytorium github. Może występować pewne ograniczenie zapory ogniowej lub programu antywirusowego.
shasi kanth
Jeśli ktoś napotka ten błąd podczas korzystania z Bower, utwórz plik .bowerrc z zawartością { "strict-ssl": false }. Nie dziękuj mi, dziękuję temu facetowi: stapp.space/fight-with-2 Walczyłem z tym błędem przez prawie 5 godzin, prosto !!
Ganesh Jadhav

Odpowiedzi:

267

Otwórz Git Bash i uruchom polecenie, jeśli chcesz całkowicie wyłączyć weryfikację SSL.

git config --global http.sslVerify false

Uwaga: to rozwiązanie może otworzyć cię na ataki typu man-in-the-middle . Dlatego włącz ponownie weryfikację jak najszybciej:

git config --global http.sslVerify true
Samir
źródło
70
Ta odpowiedź niweczy bezpieczeństwo protokołu SSL, umożliwiając ataki typu man-in-the-middle. Inne odpowiedzi już wyjaśniają, jak skonfigurować git, aby ufał konkretnemu certyfikatowi, którego potrzebujesz.
dsh,
12
okropna odpowiedź, nawet nie każesz im włączać SSL ponownie. Właśnie dlatego zdarzają się luki w zabezpieczeniach.
Edgar Aroutiounian
Jeśli korzystasz z Gitblit, nie ma innej opcji zamiast sshVerify false.
Samir
24
Aby wyłączyć weryfikację TLS / SSL dla pojedynczego polecenia git, użyj następującego polecenia:git -c http.sslVerify=false clone https://domain.com/path/to/git
Maxim Suslov
1
Poniżej podano kilka rozwiązań, a ja już zasugerowałem minusy. Więc to od Ciebie zależy, jakie rozwiązania wybierzesz, aby rozwiązać problem.
Samir
153

Problem polega na tym, że git domyślnie korzysta z backendu kryptograficznego „Linux”.

Począwszy od Git dla Windows 2.14, możesz teraz skonfigurować Git do korzystania z SChannel, wbudowanej warstwy sieci Windows jako backendu kryptograficznego. Oznacza to, że będzie korzystał z mechanizmu przechowywania certyfikatów systemu Windows i nie trzeba jawnie konfigurować mechanizmu przechowywania curl CA: https://msdn.microsoft.com/en-us/library/windows/desktop/aa380123(v= vs.85) .aspx

Po prostu wykonaj:

git config --global http.sslbackend schannel

To powinno pomóc.

Używanie Schannel jest teraz standardowym ustawieniem podczas instalowania gita dla Windows, zaleca się również, aby nie sprawdzać repozytoriów przez SSH, jeśli to możliwe, ponieważ https jest łatwiejszy do skonfigurowania i jest mniej prawdopodobne, że zostanie zablokowany przez zaporę ogniową, co oznacza mniejsze prawdopodobieństwo awarii.

Ihor Zenich
źródło
1
Należy jednak pamiętać, że to rozwiązanie może spowodować, że git config --global http.sslCAInfo <my-server-self-signed-cert.pem>nie będzie działać. Skonfigurowałem, http.sslCAInfoaby używać samopodpisanego certyfikatu dla mojego serwera, i to jest powód (może nie być taki sam jak OP), że napotkałem „Problem z certyfikatem SSL: nie mogę uzyskać lokalnego certyfikatu wystawcy”, gdy np git clone https://github.com/Microsoft/vscode.git. Wreszcie użyłem odpowiedzi z stackoverflow.com/a/47196562/1323552 (Ben PP Tung), aby dostroić konfigurację sslCAInfo specyficzną dla mojego serwera git, aby ją rozwiązać.
Johnny Wong,
94

Też miałem ten problem. W moim przypadku próbowałem uzyskać hak Git po odbiorze, aby aktualizować kopię roboczą na serwerze przy każdym wypychaniu. Próbowałem postępować zgodnie z instrukcjami na blogu, do którego prowadziłeś link. Nie działało to również dla mnie, a nadpisywanie ustawień dla poszczególnych użytkowników również nie działało.

Ostatecznie musiałem wyłączyć weryfikację protokołu SSL (jak wspomniano w artykule) dla Git jako całości. Nie jest to idealne rozwiązanie, ale zadziała, dopóki nie znajdę lepszego.

Edytowałem plik tekstowy konfiguracji Git (z moją ulubioną neutralną aplikacją kończącą linię, taką jak Notepad ++) znajdującą się pod adresem:

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

W bloku [http] dodałem opcję wyłączenia sslVerify. Kiedy skończyłem, wyglądało to tak:

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

To załatwiło sprawę.

UWAGA:

  • Wyłącza to weryfikację SSL i nie jest zalecane jako rozwiązanie długoterminowe.

  • Możesz wyłączyć to repozytorium, które wciąż nie jest świetne, ale lokalizuje ustawienie.

  • Wraz z pojawieniem się LetsEncrypt.org jest teraz dość proste, zautomatyzowane i darmowe konfigurowanie SSL jako alternatywy dla certyfikatów z podpisem własnym i neguje potrzebę wyłączenia sslVerify.

kiddailey
źródło
145
To przeczy celowi SSL.
syaz
49
możesz użyć polecenia „git config --global http.sslVerify false”, aby wyłączyć weryfikację SSL
CleanCoder
6
Dziękujemy za wskazanie sslCAinfowpisu konfiguracji; ale nie oceniam odpowiedzi, ponieważ nie ma sensu trwale wyłączać SSL dla git w całym systemie (czy próbowałeś go wyłączyć w całym systemie, następnie sklonować, a następnie włączyć ponownie, a następnie wyłączyć w lokalna konfiguracja git dla nowo sklonowanego repozytorium?).
7heo.tk
35
W przypadku jednorazowego polecenia nie ma potrzeby zmiany plików konfiguracyjnych:git -c http.sslVerify=false clone https://...
pts
8
Lepiej to naprawić tutaj: blogs.msdn.microsoft.com/phkelley/2014/01/20/…
Warren P
51

kiddailey Myślę, że było dość blisko, jednak nie wyłączyłbym weryfikacji ssl, a raczej po prostu podałem lokalny certyfikat:

W pliku konfiguracyjnym Git

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

Lub za pomocą wiersza poleceń:

git config --global http.sslCAinfo /bin/curl-ca-bundle.crt
Oliver
źródło
7
Na Git dla Windows, to jestgit config --global http.sslCAinfo /usr/ssl/certs/ca-bundle.crt
Karsten Tinnefeld
Lub dla mniegit config --global http.sslCAinfo /c/Program\ Files\ \(x86\)/Git/bin/curl-ca-bundle.crt
sparrowt
Dla użytkowników MacPorts jest togit config --global http.sslCAinfo /opt/local/share/curl/curl-ca-bundle.crt
miken32
3
Za pomocą Git 2.8 możesz git config --list --show-originsprawdzić, gdzie ustawiona jest konfiguracja http.sslCAinfo
Anish
Moja lokalizacja certyfikatu na komputerze Mac to: ~ / macports / share / curl / curl-ca-
bundle.crt
47

Ja także zmierzyłem się z tym problemem. I wreszcie udało się rozwiązać, uzyskując wskazówki z tego bloga MSDN .

Aktualizacja

W rzeczywistości musisz dodać certyfikat do pliku certyfikatów git curl-ca-bundel.cert, który znajduje się w katalogu Git \ bin.

Kroki

  1. Otwórz stronę github w przeglądarce i kliknij ikonę kłódki na pasku adresu.
  2. W otwartym małym wyskakującym okienku przejdź do linku „wyświetl certyfikat”, otworzy się okno wyskakujące.
  3. W którym przejdź do zakładki certyfikaty (3. w moim przypadku). Wybierz górny węzeł, który jest certyfikatem głównym. I naciśnij przycisk kopiowania certyfikatu na dole i zapisz plik.
  4. W Eksploratorze plików przejdź do katalogu Git \ bin i otwórz curl-ca-bundle.crt w edytorze tekstu.
  5. Otwórz eksportowany plik certyfikatu (w kroku 3) również w edytorze tekstu.
  6. Skopiuj całą zawartość z wyeksportowanego certyfikatu na koniec curl-ca-bundle.crt i zapisz.

Na koniec sprawdź status. Pamiętaj, że przed edycją wykonaj kopię zapasową pliku curl-ca-bundle.crt, aby zachować bezpieczeństwo.

Nadeem Jamali
źródło
3
„nawiguj w katalogu Git \ bin i otwórz curl-ca-bundle.crt” W git \ bin nie ma curl-ca-bundle.crt!
Anton K
@AntonK, jeśli nie istnieje, utwórz go samodzielnie w notatniku i zmień jego nazwę za pomocą curl-ca-bundle.crt. Pozostałe kroki pozostają takie same.
Nadeem Jamali
16
@AntonK Może być nazywany sprawiedliwym ca-bundle.crti znajdować się w mingw64\ssl\certslub mingw32\ssl\certs.
Ian Kemp,
Wykorzystano to dla SourceTree Atlassian. Dołączona instalacja GIT znajduje się w% userprofile% \ appdata \ local \ attlassian \ sourcetree \ git_local. curl-ca-bundle.crt już istniał, dołączyłem mój eksportowany certyfikat root w formacie base64.
Xanothos,
40

Odpowiedź na to pytanie Użycie makecert dla programistów SSL naprawiło to dla mnie.

Nie wiem dlaczego, ale certyfikat utworzony przez prosty link „Utwórz certyfikat z podpisem własnym” w Menedżerze IIS nie rozwiązuje problemu. Podążyłem za tym podejściem w powiązanym pytaniu dotyczącym tworzenia i instalowania samopodpisanego katalogu głównego CA; następnie używając go do wystawienia certyfikatu uwierzytelnienia serwera dla mojego serwera. Zainstalowałem oba z nich w IIS.

To sprawia, że ​​moja sytuacja jest taka sama jak w blogu wymienionym w pierwotnym pytaniu. Po skopiowaniu / wklejeniu certyfikatu głównego do curl-ca-bundle.crt kombinacja git / curl została spełniona.

RichardHowells
źródło
„Nie wiem dlaczego, ale certyfikat utworzony za pomocą prostego łącza„ Utwórz certyfikat z podpisem własnym ”w Menedżerze IIS nie rozwiązuje problemu ...” - Najlepiej, co mogę powiedzieć, tworzy zniekształcone certyfikaty. Podczas tworzenia certyfikatów X.509 istnieje wiele reguł; „zrób minimum, aby to działało” już nie działa dobrze. Zobacz także Jak podpisać wniosek o podpisanie certyfikatu w urzędzie certyfikacji i Jak utworzyć samopodpisany certyfikat za pomocą openssl?
jww
To działało dla mnie, ale chwilowo się rozłączyłem w części „Zainstalowałem oba w IIS”. Aby oświadczyć innym ... certyfikat serwera jest przypisany w IIS, a główny urząd certyfikacji musi zostać zaimportowany do „Zaufanych głównych urzędów certyfikacji” za pomocą narzędzia menedżera certyfikatów systemu Windows (certmgr.msc)
Philip
26

Aby uniknąć całkowitego wyłączenia weryfikacji ssl lub duplikowania / zhakowania dołączonego pliku certyfikatu CA używanego przez git, możesz wyeksportować łańcuch certyfikatów hosta do pliku i zmusić go do użycia:

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

Jeśli to nie zadziała, możesz wyłączyć weryfikację ssl tylko dla hosta:

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

Uwaga: Poddany możliwemu atakowi typu man in the middle, gdy weryfikacja ssl jest wyłączona.

zionyx
źródło
4
Warto zauważyć, że ta --globalopcja nie jest konieczna: jeśli pominiesz --global, ustawienie dotyczy tylko tego konkretnego repozytorium git.
Wes Turner
19

Właśnie miałem ten sam problem, ale korzystałem z sourcetree w systemie Windows. Te same kroki dla normalnego GIT również w systemie Windows. Po wykonaniu poniższych kroków udało mi się rozwiązać ten problem.

  1. Uzyskaj drzewo certyfikatów serwera Można to zrobić za pomocą chrome. Przejdź do adresu serwera. Kliknij ikonę kłódki i wyświetl certyfikaty. Wyeksportuj cały łańcuch certyfikatów do formatu plików zakodowanych w standardzie base64 (PEM).
  2. Dodaj certyfikaty do łańcucha zaufania pliku konfiguracyjnego zaufania GIT Uruchom polecenie „git config --list”. znajdź konfigurację „http.sslcainfo”, która pokazuje, gdzie znajduje się plik zaufania certyfikatu. Skopiuj wszystkie certyfikaty do pliku łańcucha zaufania, w tym „- -BEGIN- -” i „- -END- -”.
  3. Pamiętaj, aby dodać cały łańcuch certyfikatów do pliku certyfikatów

To powinno rozwiązać problem z samopodpisanymi certyfikatami i korzystaniem z GIT.

Próbowałem użyć konfiguracji „http.sslcapath”, ale to nie działało. Również jeśli nie dołączę całego łańcucha do pliku certyfikatów, to również się nie powiedzie. Jeśli ktoś ma wskaźniki na nich, daj mi znać, ponieważ powyższe należy powtórzyć dla nowej instalacji.

Jeśli jest to GIT systemowy, możesz użyć opcji w NARZĘDZIA -> karta GIT opcji, aby użyć GIT systemowego, co rozwiązuje problem również w sourcetree.

JamesD
źródło
2
„gdybym nie
zawarł
Jeśli chodzi o cały łańcuch, mam dwa certyfikaty powyżej certyfikatu github. Czy dołączam je w kolejności jako root-> next cert-> github cert w pliku sslcainfo.crt?
Jecoms,
Byłem w stanie uzyskać dostęp do pakietów git repo, po prostu dodając certyfikat root.
Jecoms,
Dla przyszłych czytelników. Nie mam pojęcia, czy to ma znaczenie, ale umieszczam certyfikat „root” (najwyższy) na końcu pliku (http.sslcainfo). A kiedy odszedłem od głównego certyfikatu w łańcuchu, umieściłem ten certyfikat nad poprzednim wpisem pliku (http.sslcainfo).
granadaCoder
11

W przypadku repozytoriów github (lub jakichkolwiek certyfikatów niepodpisanych przez siebie) wybranie poniżej podczas instalacji Git-on-windows rozwiązało problem.

wprowadź opis zdjęcia tutaj

Jawad Al Shaikh
źródło
1
Wyglądało na to, że odpowiedziałeś na inne pytanie. Pytanie OP dotyczyło certyfikatów z podpisem własnym na klientach Windows.
jww
@jww tytuł pytania to komunikat o błędzie git, który jest wyświetlany, nawet jeśli repo NIE jest samopodpisanym SSL!
Jawad Al Shaikh
Doprowadziło mnie to do błędu, ale dostęp do GitHub Enterprise wymagał wygenerowania klucza i dodania kluczy publicznych / prywatnych.
ΩmegaMan
1
Jeśli samopodpisany certyfikat został umieszczony w magazynie certyfikatów systemu Windows przez pomocnego administratora systemu Windows za pośrednictwem zasad grupy, ta odpowiedź również jest dobra.
JamesD
7

Miałem już ten problem i rozwiązałem go za pomocą następującej konfiguracji.

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

Od wersji git 2.3.1 możesz wstawić https://your.domainpo http, aby wskazać, że następujący certyfikat jest tylko dla niego.

Ben PP Tung
źródło
1
Jest to najprostsze i najdokładniejsze rozwiązanie, jakie znalazłem, jeśli również skonfigurowałeś git config --global http.sslCAInfo <your-server-self-signed-cert.pem>wcześniej ( dlatego powoduje błąd „nie można uzyskać lokalnego certyfikatu wystawcy”)
Johnny Wong
TO była poprawna odpowiedź na mój problem (a nie tylko „wyłączenie sprawdzania poprawności SSL” ~~). Nie wiedziałem, że możesz określić lokalizację certyfikatu tylko dla określonego hosta. As!
Rocío García Luque
1
  1. Pobierz certyfikat z tego linku: https://github.com/bagder/ca-bundle
  2. Dodaj to do C:\Program Files\Git\bin iC:\Program Files\Git\mingw64\bin

Następnie spróbuj czegoś takiego: git clone https://github.com/heroku/node-js-getting-started.git

Alex
źródło
1

Jedną rzeczą, która mnie zawiodła, był format ścieżki (na moim komputerze z systemem Windows). Pierwotnie miałem to:

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

Nie udało się to jednak z powodu błędu „nie można uzyskać certyfikatu lokalnego wystawcy”.

W końcu zadziałało to:

git config --global http.sslCAInfo "C:\\certs\\cacert.pem"
Wayne S.
źródło
1

W moim przypadku, ponieważ zainstalowałem terminal ConEmu dla Windows 7, tworzy on ca-bundlepodczas instalacji oC:\Program Files\Git\mingw64\ssl\certs .

Dlatego muszę uruchomić następujące polecenia na terminalu, aby działało:

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

Dlatego mój C:\Program Files\Git\etc\gitconfigzawiera następujące:

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

Wybrałem również tę samą opcję, o której wspomniano tutaj podczas instalowania Gita.

Mam nadzieję, że to pomaga!

rc.adhikari
źródło
1

Aby naprawić błąd szczególny Problem z certyfikatem SSL: nie można uzyskać lokalnego certyfikatu wystawcy w git

Miałem ten sam problem z certyfikatami Let's Encrypt.

Witryna z https potrzebujemy tylko:

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

ale git pull mówi:

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

Aby to naprawić, musimy również dodać:

SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
Sérgio
źródło
-5

Użyj tego polecenia wcześniej, aby uruchomić aktualizację / instalację kompozytora:

git config --global http.sslverify false
Prashant Paliwal
źródło