Konfigurieren Sie Git so, dass ein bestimmtes selbstsigniertes Serverzertifikat für eine bestimmte https-Fernbedienung akzeptiert wird

167

Der Systemadministrator für ein Projekt, an dem ich arbeite, hat entschieden, dass SSH "zu viel Ärger" ist. Stattdessen hat er Git so eingerichtet, dass er über eine https://URL (und die Authentifizierung mit Benutzername / Passwort) zugänglich ist . Der Server für diese URL zeigt ein selbstsigniertes Zertifikat an. Daher riet er allen, die Zertifikatsüberprüfung zu deaktivieren. Dies scheint mir in Bezug auf die Sicherheit kein gutes Setup zu sein.

Ist es möglich, Git mitzuteilen, dass für Remote X (oder besser für jede Remote in einem Repository, mit dem gerade begonnen wird https://$SERVERNAME/) ein bestimmtes Zertifikat akzeptiert werden soll und nur dieses Zertifikat? Reduzieren Sie grundsätzlich das Serverschlüsselverhalten von SSH.

zwol
quelle
Sie fragen nach C Git unter Unix, nehme ich an?
Piotr Findeisen
Yah. Nun, möglicherweise auch Windows, aber das macht momentan niemand.
zwol
5
WTF? @Zack Sie haben absolut Recht mit den Zertifikatsprüfungen. Wenn Ihr Administrator sagt, dass Sie Zertifikatsprüfungen deaktivieren sollten, kann er auch TLS auf dem Server deaktivieren, da dann jeder den Schutz vor einem Man-in-the-Middle-Angriff deaktiviert.
Rudi
@Rudi, ist dies immer noch der Fall, wenn sie eine IP-Adresse verwenden, um auf den Server zuzugreifen? (Es scheint, dass die DNS-Suche ist, wie MITM dazwischen kommt, also denke ich, dass die IP-Adresse dagegen immun sein sollte.)
Chris
6
@ Chris Ja, das ist immer noch der Fall. Ein MITM-Router kann so tun, als wäre er eine beliebige IP-Adresse. (Sie kennen die Interstitial-Seiten, die Sie über das kostenlose WLAN am Flughafen erhalten? Das sind MITMs. Versuchen Sie, irgendwann über die IP-Adresse auf eine Seite zuzugreifen.)
zwol

Antworten:

295

Kurz:

  1. Holen Sie sich das selbstsignierte Zertifikat
  2. Legen Sie es in eine (zB ~/git-certs/cert.pem) Datei
  3. Stellen Sie ein, gitum diesem Zertifikat mithilfe des http.sslCAInfoParameters zu vertrauen

In weiteren Details:

Holen Sie sich ein selbstsigniertes Zertifikat des Remote-Servers

Angenommen, die Server-URL lautet repos.sample.comund Sie möchten über den Port darauf zugreifen 443.

Es gibt mehrere Möglichkeiten, wie Sie es bekommen.

Zertifikat mit openssl abrufen

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

Fangen Sie die Ausgabe in einer Datei ab cert.pemund löschen Sie alle bis auf einen Teil zwischen (und einschließlich) -BEGIN CERTIFICATE-und-END CERTIFICATE-

Der Inhalt der resultierenden Datei ~ / git-certs / cert.pem kann folgendermaßen aussehen:

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

Holen Sie sich das Zertifikat mit Ihrem Webbrowser

Ich verwende Redmine mit Git-Repositorys und greife auf dieselbe URL für die Web-Benutzeroberfläche und den Zugriff auf die Git-Befehlszeile zu. Auf diese Weise musste ich meinem Webbrowser eine Ausnahme für diese Domain hinzufügen.

Mit Firefox ging ich zu Options -> Advanced -> Certificates -> View Certificates -> Servers, fand dort den selbstsignierten Host, wählte ihn aus und mit der ExportSchaltfläche erhielt ich genau die gleiche Datei, die mit erstellt wurde openssl.

Hinweis: Ich war etwas überrascht, es ist kein Name der Behörde sichtbar erwähnt. Das ist in Ordnung.

Das vertrauenswürdige Zertifikat in einer dedizierten Datei haben

Vorherige Schritte führen dazu, dass das Zertifikat in einer Datei gespeichert ist. Es spielt keine Rolle, um welche Datei es sich handelt, solange sie für Ihren Git beim Zugriff auf diese Domain sichtbar ist. ich benutzte~/git-certs/cert.pem

Hinweis: Wenn Sie vertrauenswürdigere selbstsignierte Zertifikate benötigen, legen Sie diese in derselben Datei ab:

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

Dies soll funktionieren (aber ich habe es nur mit einem einzigen Zertifikat getestet).

Konfigurieren Sie git so, dass es diesem Zertifikat vertraut

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

Sie können auch versuchen, dies systemweit zu tun, indem Sie --systemanstelle von verwenden --global.

Und testen Sie es: Sie können jetzt mit Ihrem Server kommunizieren, ohne auf Folgendes zurückgreifen zu müssen:

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

Wenn Sie Ihren Git bereits auf Unkenntnis von SSL-Zertifikaten eingestellt haben, deaktivieren Sie ihn:

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

und Sie können auch überprüfen, ob Sie alles richtig gemacht haben, ohne Rechtschreibfehler:

$ git config --global --list

Was alle Variablen auflisten soll, haben Sie global festgelegt. (Ich habe http zu htt falsch geschrieben).

Jan Vlcinsky
quelle
1
Ich denke, dass diese Antwort korrekter und vollständiger ist als die akzeptierte. danke @Jan Vlcinsky
Alfredo Cavalcanti
1
Danach funktionieren die üblichen von der Behörde signierten Zertifikate nicht mehr, sodass ich z. B. nicht von Github abrufen kann. Gibt es eine Möglichkeit, ein selbstsigniertes Zertifikat hinzuzufügen, ohne die von der Behörde signierten zu deaktivieren?
Michael Ivko
4
@ MichaelIvko-Lösung, die die hier beschriebenen "üblichen, von der Behörde signierten Zertifikate" berücksichtigt (Sie müssen Ihr Zertifikat zur Datei "curl-ca-bundle.crt" hinzufügen): blogs.msdn.com/b/phkelley/archive/2014/
01/20
3
Das Problem bei diesem Ansatz ist, dass alle mit git gelieferten Standardzertifizierungsstellen effektiv entfernt werden (z. B. können Sie danach nicht mehr von github abrufen). Höchstwahrscheinlich suchen die meisten nicht danach. Ein besseres Beispiel ist, die neue Stammzertifizierungsstelle zu einer Kopie von Git \ bin \ curl-ca-bundle.crt hinzuzufügen und dann auf die neue Kopie von curl-ca-bundle.crt aus Ihrer gitconfig zu verweisen.
Crimbo
3
es funktioniert unter Windows! Exportieren Sie jedes Zertifikat in der Zertifikatkette als Base64-codierte X.509-Datei (.CER). Fügen Sie alle Dateien zusammen und verweisen Sie auf diese Datei. Stellen Sie sicher, dass Sie keine Leerzeichen im Pfad zur Zertifizierungsdatei haben (verwenden Sie oldschool-Pfade)
pscheit
3

OSX-Benutzeranpassungen.

Das Befolgen der Schritte der akzeptierten Antwort funktionierte bei mir mit einem kleinen Zusatz bei der Konfiguration unter OSX.

Ich habe die cert.pemDatei in einem Verzeichnis unter meinem OSX-angemeldeten Benutzer abgelegt und daher den Speicherort für das vertrauenswürdige Zertifikat angepasst.

Konfigurieren Sie git so, dass es diesem Zertifikat vertraut:

$ git config --global http.sslCAInfo $HOME/git-certs/cert.pem
Chris Langston
quelle