Skonfiguruj Git, aby akceptował określony certyfikat serwera z podpisem własnym dla określonego pilota HTTPS

167

Administrator systemu dla projektu, w którym się znajduję, zdecydował, że SSH jest „zbyt wielkim problemem”; zamiast tego skonfigurował Git tak, aby był dostępny za pośrednictwem https://adresu URL (i uwierzytelniania nazwy użytkownika / hasła). Serwer dla tego adresu URL przedstawia certyfikat z podpisem własnym, więc doradził wszystkim, aby wyłączyć sprawdzanie poprawności certyfikatu. Nie wydaje mi się to dobrą konfiguracją pod względem bezpieczeństwa.

Czy można powiedzieć Gitowi, że dla zdalnego X (lub lepiej, dowolnego zdalnego w jakimkolwiek repozytorium, od którego się tak dzieje https://$SERVERNAME/) ma akceptować określony certyfikat i tylko ten certyfikat? Zasadniczo zredplikuj zachowanie klucza serwera SSH.

zwol
źródło
Zakładam, że pytasz o C Git na Uniksie?
Piotr Findeisen
Tak. Cóż, możliwe, że również Windows, ale nikt tego teraz nie robi.
zwol
5
WTF? @Zack masz całkowitą rację co do kontroli certyfikatów. Kiedy administrator mówi, że należy wyłączyć sprawdzanie certyfikatów, może również wyłączyć TLS na serwerze, ponieważ wtedy każdy z nich wyłącza ochronę przed atakiem typu man-in-the-middle.
Rudi
@Rudi, czy nadal tak jest, jeśli używają adresu IP, aby uzyskać dostęp do serwera? (Wygląda na to, że wyszukiwanie DNS jest sposobem, w jaki MITM dostaje się pomiędzy, więc myślę, że adres IP powinien być na to odporny.)
Chris
6
@Chris Tak, nadal tak jest. Router MITM może udawać dowolny adres IP. (Znasz te strony pełnoekranowe, które dostajesz w darmowym Wi-Fi na lotnisku? To są MITMy. Spróbuj kiedyś uzyskać dostęp do strony za pomocą adresu IP.)
zwol

Odpowiedzi:

295

Krótko:

  1. Uzyskaj certyfikat z podpisem własnym
  2. Umieść go w jakimś (np. ~/git-certs/cert.pem) Pliku
  3. Ustaw gitzaufanie do tego certyfikatu przy użyciu http.sslCAInfoparametru

Bardziej szczegółowo:

Uzyskaj certyfikat z podpisem własnym zdalnego serwera

Zakładając, że adres URL serwera to repos.sample.comi chcesz uzyskać do niego dostęp przez port 443.

Istnieje wiele opcji, jak to zdobyć.

Uzyskaj certyfikat za pomocą openssl

$ openssl s_client -connect repos.sample.com:443

Przechwyć dane wyjściowe do pliku cert.pemi usuń wszystkie z wyjątkiem części między (włącznie) -BEGIN CERTIFICATE-i-END CERTIFICATE-

Zawartość wynikowego pliku ~ / git-certs / cert.pem może wyglądać następująco:

-----BEGIN CERTIFICATE-----
MIIDnzCCAocCBE/xnXAwDQYJKoZIhvcNAQEFBQAwgZMxCzAJBgNVBAYTAkRFMRUw
EwYDVQQIEwxMb3dlciBTYXhvbnkxEjAQBgNVBAcTCVdvbGZzYnVyZzEYMBYGA1UE
ChMPU2FhUy1TZWN1cmUuY29tMRowGAYDVQQDFBEqLnNhYXMtc2VjdXJlLmNvbTEj
MCEGCSqGSIb3DQEJARYUaW5mb0BzYWFzLXNlY3VyZS5jb20wHhcNMTIwNzAyMTMw
OTA0WhcNMTMwNzAyMTMwOTA0WjCBkzELMAkGA1UEBhMCREUxFTATBgNVBAgTDExv
d2VyIFNheG9ueTESMBAGA1UEBxMJV29sZnNidXJnMRgwFgYDVQQKEw9TYWFTLVNl
Y3VyZS5jb20xGjAYBgNVBAMUESouc2Fhcy1zZWN1cmUuY29tMSMwIQYJKoZIhvcN
AQkBFhRpbmZvQHNhYXMtc2VjdXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAMUZ472W3EVFYGSHTgFV0LR2YVE1U//sZimhCKGFBhH3ZfGwqtu7
mzOhlCQef9nqGxgH+U5DG43B6MxDzhoP7R8e1GLbNH3xVqMHqEdcek8jtiJvfj2a
pRSkFTCVJ9i0GYFOQfQYV6RJ4vAunQioiw07OmsxL6C5l3K/r+qJTlStpPK5dv4z
Sy+jmAcQMaIcWv8wgBAxdzo8UVwIL63gLlBz7WfSB2Ti5XBbse/83wyNa5bPJPf1
U+7uLSofz+dehHtgtKfHD8XpPoQBt0Y9ExbLN1ysdR9XfsNfBI5K6Uokq/tVDxNi
SHM4/7uKNo/4b7OP24hvCeXW8oRyRzpyDxMCAwEAATANBgkqhkiG9w0BAQUFAAOC
AQEAp7S/E1ZGCey5Oyn3qwP4q+geQqOhRtaPqdH6ABnqUYHcGYB77GcStQxnqnOZ
MJwIaIZqlz+59taB6U2lG30u3cZ1FITuz+fWXdfELKPWPjDoHkwumkz3zcCVrrtI
ktRzk7AeazHcLEwkUjB5Rm75N9+dOo6Ay89JCcPKb+tNqOszY10y6U3kX3uiSzrJ
ejSq/tRyvMFT1FlJ8tKoZBWbkThevMhx7jk5qsoCpLPmPoYCEoLEtpMYiQnDZgUc
TNoL1GjoDrjgmSen4QN5QZEGTOe/dsv1sGxWC+Tv/VwUl2GqVtKPZdKtGFqI8TLn
/27/jIdVQIKvHok2P/u9tvTUQA==
-----END CERTIFICATE-----

Uzyskaj certyfikat za pomocą przeglądarki internetowej

Używam Redmine z repozytoriami Git i uzyskuję dostęp do tego samego adresu URL dla interfejsu internetowego i dla dostępu do wiersza poleceń git. W ten sposób musiałem dodać wyjątek dla tej domeny do mojej przeglądarki internetowej.

Korzystając z przeglądarki Firefox, poszedłem do Options -> Advanced -> Certificates -> View Certificates -> Servers, znalazłem tam podpisanego przez siebie hosta, wybrałem go i za pomocą Exportprzycisku otrzymałem dokładnie ten sam plik, co utworzony za pomocą openssl.

Uwaga: byłem trochę zaskoczony, nie ma widocznej nazwy organu. Jest okej.

Posiadanie zaufanego certyfikatu w dedykowanym pliku

Poprzednie kroki powinny skutkować umieszczeniem certyfikatu w jakimś pliku. Nie ma znaczenia, jaki to plik, o ile jest widoczny dla twojego gita podczas uzyskiwania dostępu do tej domeny. użyłem~/git-certs/cert.pem

Uwaga: jeśli potrzebujesz więcej zaufanych certyfikatów z podpisem własnym, umieść je w tym samym pliku:

-----BEGIN CERTIFICATE-----
MIIDnzCCAocCBE/xnXAwDQYJKoZIhvcNAQEFBQAwgZMxCzAJBgNVBAYTAkRFMRUw
...........
/27/jIdVQIKvHok2P/u9tvTUQA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
AnOtHeRtRuStEdCeRtIfIcAtEgOeShErExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxw
...........
/27/jIdVQIKvHok2P/u9tvTUQA==
-----END CERTIFICATE-----

To zadziała (ale testowałem to tylko z jednym certyfikatem).

Skonfiguruj git, aby ufał temu certyfikatowi

$ git config --global http.sslCAInfo /home/javl/git-certs/cert.pem

Możesz również spróbować zrobić to w całym systemie, używając --systemzamiast --global.

I przetestuj to: będziesz mógł teraz komunikować się ze swoim serwerem bez uciekania się do:

$ git config --global http.sslVerify false #NO NEED TO USE THIS

Jeśli już ustawiłeś swojego gita na ignorowanie certyfikatów ssl, usuń to:

$ git config --global --unset http.sslVerify

i możesz też sprawdzić, czy wszystko zrobiłeś poprawnie, bez błędów ortograficznych:

$ git config --global --list

co powinno zawierać listę wszystkich zmiennych, które ustawiłeś globalnie. (Źle napisałem http na htt).

Jan Vlcinsky
źródło
1
Myślę, że ta odpowiedź jest bardziej poprawna i kompletna niż ta przyjęta. dziękuję @Jan Vlcinsky
Alfredo Cavalcanti
1
Po tym czasie zwykłe certyfikaty podpisane przez autorytet przestają działać, więc nie mogę wyciągnąć np. Z Githuba. Czy istnieje sposób na dodanie certyfikatu z podpisem własnym bez wyłączania certyfikatów podpisanych przez urząd?
Michael Ivko
4
Rozwiązanie @MichaelIvko, które uwzględnia `` zwykłe certyfikaty podpisane przez urząd '' opisane tutaj (musisz dodać swój certyfikat do pliku ``
01/20
3
Problem z tym podejściem polega na tym, że skutecznie usuwa wszystkie domyślne CA, które są dostarczane z git (np. Po wykonaniu tej czynności nie będzie można pobrać z github). Najprawdopodobniej nie tego właśnie szuka większość. Lepszym przykładem jest dodanie nowego głównego urzędu certyfikacji do kopii Git \ bin \ curl-ca-bundle.crt, a następnie odniesienie do nowej kopii curl-ca-bundle.crt z pliku gitconfig.
crimbo
3
to działa w systemie Windows! wyeksportuj każdy certyfikat w łańcuchu certyfikatów jako plik X.509 z kodowaniem Base64 (.CER). Umieść wszystkie pliki razem i odwołaj się do tego pliku. Upewnij się, że nie masz spacji w ścieżce do pliku certyfikatu (użyj ścieżek oldschoolowych)
pscheit
3

Ustawienia użytkownika OSX.

Postępowanie zgodnie z krokami zaakceptowanej odpowiedzi zadziałało dla mnie z niewielkim dodatkiem podczas konfigurowania w systemie OSX.

Umieściłem cert.pemplik w katalogu pod moim zalogowanym użytkownikiem OSX i tym samym zmusiłem mnie do dostosowania lokalizacji dla zaufanego certyfikatu.

Skonfiguruj git, aby ufał temu certyfikatowi:

$ git config --global http.sslCAInfo $HOME/git-certs/cert.pem
Chris Langston
źródło