Git'i belirli bir https uzaktan kumandası için belirli bir kendinden imzalı sunucu sertifikasını kabul edecek şekilde yapılandırma


167

Üzerinde çalıştığım bir projenin sistem yöneticisi SSH'nin "çok fazla sorun" olduğuna karar verdi; bunun yerine Git'i bir https://URL (ve kullanıcı adı / şifre kimlik doğrulaması) aracılığıyla erişilebilir olacak şekilde ayarladı . Bu URL'nin sunucusu kendinden imzalı bir sertifika sunuyor, bu nedenle herkese sertifika doğrulamasını kapatmasını önerdi. Bu bana güvenlik açısından iyi bir kurulum gibi gelmiyor.

Git'e uzak X (veya daha iyisi, herhangi bir depodaki herhangi bir uzaktan kumanda için https://$SERVERNAME/) belirli bir sertifikayı ve sadece bu sertifikayı kabul etmek olduğunu söylemek mümkün müdür ? Temel olarak SSH'nin sunucu anahtarı davranışını çoğaltın.


Unix'te C Git'i mi soruyorsun, sanırım?
Piotr Findeisen

Yah. Peki, muhtemelen Windows da, ama şu anda kimse bunu yapmıyor.
zwol

5
O NE LAN? @ Sertifika denetimleri konusunda mutlak hakınız var. Yöneticiniz sertifika kontrollerini kapatmanız gerektiğini söylediğinde, sunucudaki TLS'yi de kapatabilir, çünkü o zaman her biri ortadaki bir adam saldırısına karşı korumayı devre dışı bırakır.
Rudi

@Rudi, sunucuya erişmek için bir IP adresi kullanıyorlarsa durum hala böyle mi? (Görünüşe göre DNS araması MITM nasıl devreye giriyor, bu yüzden IP adresinin buna karşı bağışık olması gerektiğini düşünüyorum.)
Chris

6
@Chris Evet, hala durum böyle. Bir MITM yönlendirici istedikleri herhangi bir IP adresi gibi davranabilir. (Havaalanındaki ücretsiz wifi'de aldığınız geçiş reklamı sayfalarını biliyor musunuz? Bunlar MITM'ler. Bazen IP adresine göre bir sayfaya erişmeyi deneyin.)
zwol

Yanıtlar:


295

Kısaca:

  1. Kendinden imzalı sertifika alın
  2. Bazı (örneğin ~/git-certs/cert.pem) bir dosyaya koyun
  3. Parametre gitkullanarak bu sertifikaya güvenecek şekilde ayarlahttp.sslCAInfo

Daha ayrıntılı olarak:

Uzak sunucunun kendinden imzalı sertifikasını edinin

Varsayarsak, sunucu URL'si repos.sample.combağlantı noktası üzerinden erişilir 443.

Birden fazla seçenek var, nasıl alınır.

Openssl kullanarak sertifika alma

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

Bir dosya içine çıktı yakala cert.pemve (dahil ve) tüm ama bir kısmını arasında silmek -BEGIN CERTIFICATE-ve-END CERTIFICATE-

Oluşan ~ / git-certs / cert.pem dosyasının içeriği şöyle görünebilir:

-----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-----

Web tarayıcınızı kullanarak sertifika alın

Git depolarıyla Redmine kullanıyorum ve web kullanıcı arayüzü ve git komut satırı erişimi için aynı URL'ye erişiyorum. Bu şekilde, web tarayıcma bu alan için istisna eklemek zorunda kaldım.

Firefox kullanarak gittim Options -> Advanced -> Certificates -> View Certificates -> Servers, orada kendinden imzalı bir ana bilgisayar buldum, onu seçtim ve Exportdüğmesini kullanarak oluşturduğum dosyayla tam olarak aynı dosyayı aldım openssl.

Not: Biraz şaşırdım, görünürde bahsedilen otoritenin adı yok. Bu iyi.

Güvenilir sertifikanın özel dosyada bulunması

Önceki adımlar, sertifikanın bir dosyaya sahip olmasına neden olacaktır. Bu etki alanına erişirken git'iniz tarafından görülebildiği sürece hangi dosya olduğu önemli değil. kullandım~/git-certs/cert.pem

Not: Daha güvenilir, kendinden imzalı sertifikalara ihtiyacınız varsa, bunları aynı dosyaya yerleştirin:

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

Bu işe yarayacaktır (ancak sadece tek bir sertifika ile test ettim).

Git'i bu sertifikaya güvenecek şekilde yapılandırın

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

Bunun --systemyerine , bu sistemi geniş çapta yapmaya da çalışabilirsiniz --global.

Ve test edin: Artık sunucunuzla aşağıdakilere başvurmadan iletişim kurabileceksiniz:

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

Git'inizi SSL sertifikalarının bilgisizliğine zaten ayarladıysanız, ayarını kaldırın:

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

ayrıca, yazım hataları olmadan hepsini doğru bir şekilde yaptığınızı da kontrol edebilirsiniz:

$ git config --global --list

küresel olarak ayarladığınız tüm değişkenleri listeler. (Http'yi htt'ye yanlış yazdım).


1
bu cevabın kabul edilen cevaptan daha doğru ve eksiksiz olduğunu düşünüyorum. @Jan Vlcinsky
Alfredo Cavalcanti

1
Bundan sonra her zamanki otorite imzalı sertifikalar çalışmayı durdurur, bu yüzden örneğin Github'dan çekemiyorum. İmzalı olanları kapatmadan kendinden imzalı bir sertifika eklemenin bir yolu var mı?
Michael Ivko

4
'Her zamanki otorite imzalı sertifikaları' dikkate alan @MichaelIvko çözümü burada açıldı (sertifikanızı 'curl-ca-bundle.crt' dosyasına eklemeniz gerekir): blogs.msdn.com/b/phkelley/archive/2014/
01/20

3
Bu yaklaşımdaki sorun, git ile birlikte gelen tüm varsayılan CA'ları etkili bir şekilde kaldırmasıdır (örneğin bunu yaptıktan sonra github'dan çekemezsiniz). Büyük olasılıkla en çok aradığı şey bu değildir. Daha iyi bir örnek, Git \ bin \ curl-ca-bundle.crt dosyasının bir kopyasına yeni kök CA'yı eklemek ve sonra gitconfig'nizden curl-ca-bundle.crt dosyasının yeni kopyasına başvurmaktır.
crimbo

3
Windows üzerinde çalışıyor! sertifika zincirindeki her sertifikayı Base64 kodlu X.509 dosyası (.CER) olarak dışa aktar Tüm dosyaları bir araya getirin ve bu dosyaya başvurun. Sertifika dosyasına giden yolda boşluk olmadığından emin olun (eski okul yollarını kullanın)
pscheit

3

OSX Kullanıcı ayarları.

Kabul edilen yanıtın adımlarını izleyerek OSX üzerinde yapılandırırken benim için küçük bir ek ile çalıştı.

cert.pemDosyayı OSX oturum açmış kullanıcımın altındaki bir dizine koydum ve böylece güvenilir sertifika için konumu ayarlamama neden oldum.

Git'i bu sertifikaya güvenecek şekilde yapılandırın:

$ git config --global http.sslCAInfo $HOME/git-certs/cert.pem
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.