configurare Git per accettare un particolare certificato del server autofirmato per un particolare telecomando https


167

L'amministratore di sistema per un progetto in cui mi trovo ha deciso che SSH è "troppo disturbo"; invece, ha impostato Git in modo che sia accessibile tramite un https://URL (e autenticazione nome utente / password). Il server per questo URL presenta un certificato autofirmato, quindi ha consigliato a tutti di disattivare la convalida del certificato. Questo non mi sembra una buona configurazione, dal punto di vista della sicurezza.

È possibile dire a Git che per X remoto (o meglio, qualsiasi telecomando in qualsiasi repository che inizia con https://$SERVERNAME/) deve accettare un particolare certificato e solo quel certificato? Fondamentalmente riduplica il comportamento della chiave del server SSH.


Mi stai chiedendo di C Git su Unix, presumo?
Piotr Findeisen,

Yah. Bene, presumibilmente anche Windows, ma nessuno lo sta facendo in questo momento.
zwol,

5
WTF? @Zack hai assolutamente ragione sui controlli del certificato. Quando l'amministratore ti dice che dovresti disattivare i controlli dei certificati, può anche disattivare TLS sul server, poiché da quel momento ognuno disabilita la protezione contro un attacco man-in-the-middle.
Rudi,

@Rudi, è ancora così se usano un indirizzo IP per accedere al server? (Sembra che la ricerca DNS sia il modo in cui MITM si interpone, quindi penso che l'indirizzo IP dovrebbe essere immune a questo.)
Chris,

6
@Chris Sì, è ancora così. Un router MITM può fingere di essere l'indirizzo IP che desidera. (Conosci quelle pagine interstiziali che ottieni sulla connessione wifi gratuita in aeroporto? Quelli sono MITM. Prova ad accedere a una pagina tramite indirizzo IP qualche volta.)
zwol,

Risposte:


295

Brevemente:

  1. Ottieni il certificato autofirmato
  2. Mettilo in un ~/git-certs/cert.pemfile (ad es. )
  3. Imposta gitcome attendibile questo certificato usando il http.sslCAInfoparametro

Più in dettaglio:

Ottieni il certificato autofirmato del server remoto

Supponendo, l'URL del server è repos.sample.come si desidera accedervi tramite la porta443 .

Ci sono più opzioni, come ottenerlo.

Ottieni il certificato usando openssl

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

Cattura l'output in un file cert.pemed elimina tutto tranne (tra)-BEGIN CERTIFICATE- e-END CERTIFICATE-

Il contenuto del file risultante ~ / git-certs / cert.pem può essere simile al seguente:

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

Ottieni il certificato utilizzando il tuo browser web

Uso Redmine con i repository Git e accedo allo stesso URL per l'interfaccia utente Web e per l'accesso alla riga di comando git. In questo modo, ho dovuto aggiungere un'eccezione per quel dominio nel mio browser web.

Usando Firefox, sono andato a, ho Options -> Advanced -> Certificates -> View Certificates -> Serverstrovato lì l'host autofirmato, l'ho selezionato e usando il Exportpulsante ho ottenuto esattamente lo stesso file, come creato usandoopenssl .

Nota: sono rimasto un po 'sorpreso, non c'è un nome dell'autorità menzionato in modo visibile. Questo va bene.

Avere il certificato attendibile nel file dedicato

I passaggi precedenti comportano la presenza del certificato in alcuni file. Non importa quale file sia, purché sia ​​visibile a Git quando si accede a quel dominio. ero solito~/git-certs/cert.pem

Nota: se hai bisogno di certificati autofirmati più affidabili, inseriscili nello stesso file:

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

Funzionerà (ma l'ho provato solo con un singolo certificato).

Configura git per fidarti di questo certificato

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

Puoi anche provare a fare tutto quel sistema, usando --systeminvece di --global.

E testalo: ora sarai in grado di comunicare con il tuo server senza ricorrere a:

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

Se hai già impostato il tuo git sull'ignoranza dei certificati SSL, disattivalo:

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

e puoi anche verificare che hai fatto tutto correttamente, senza errori di ortografia:

$ git config --global --list

cosa dovrebbe elencare tutte le variabili, hai impostato a livello globale. (Ho sbagliato a scrivere http su htt).


1
penso che questa risposta sia più corretta e completa di quella accettata. grazie @Jan Vlcinsky
Alfredo Cavalcanti,

1
Dopodiché i soliti certificati firmati dall'autorità smettono di funzionare, quindi non posso estrarre ad esempio da Github. C'è un modo per aggiungere un certificato autofirmato senza disattivare quelli firmati dall'autorità?
Michael Ivko,

4
@MichaelIvko soluzione che tiene conto dei "soliti certificati firmati dall'autorità" descritti qui (è necessario aggiungere il proprio certificato al file "curl-ca-bundle.crt"): blogs.msdn.com/b/phkelley/archive/2014/
01/20

3
Il problema con questo approccio è che rimuove efficacemente tutte le CA predefinite fornite con git (ad es. Dopo averlo fatto, non sarai in grado di estrarre da Github). Molto probabilmente non è quello che la maggior parte sta cercando. Un esempio migliore è quello di aggiungere la nuova CA radice a una copia di Git \ bin \ curl-ca-bundle.crt e quindi fare riferimento alla nuova copia di curl-ca-bundle.crt dal tuo gitconfig.
Crimbo,

3
funziona su Windows! esporta ogni certificato nella catena di certificati come file X.509 con codifica Base64 (.CER) Metti insieme tutti i file e fai riferimento a questo file. Assicurati di non avere spazi nel percorso del file cert (usa i percorsi oldschool)
pscheit

3

Regolazioni utente OSX.

Seguire i passaggi della risposta accettata ha funzionato per me con una piccola aggiunta durante la configurazione su OSX.

Ho inserito il cert.pemfile in una directory sotto il mio utente con accesso OSX e così mi sono fatto adeguare la posizione per il certificato attendibile.

Configurare git per fidarsi di questo certificato:

$ git config --global http.sslCAInfo $HOME/git-certs/cert.pem
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.