configurer Git pour accepter un certificat de serveur auto-signé particulier pour un distant https particulier

167

L'administrateur système d'un projet sur lequel je suis a décidé que SSH est "trop ​​de problèmes"; à la place, il a configuré Git pour qu'il soit accessible via une https://URL (et une authentification par nom d'utilisateur / mot de passe). Le serveur de cette URL présente un certificat auto-signé, il a donc conseillé à tout le monde de désactiver la validation du certificat. Cela ne me semble pas être une bonne configuration, du point de vue de la sécurité.

Est-il possible de dire à Git que pour X distant (ou mieux, n'importe quel distant dans un référentiel qui commence par https://$SERVERNAME/), il doit accepter un certificat particulier, et seulement ce certificat? En gros, redoublez le comportement de la clé serveur de SSH.

zwol
la source
Vous parlez de C Git sous Unix, je suppose?
Piotr Findeisen
Yah. Eh bien, peut-être aussi Windows, mais personne ne le fait pour le moment.
zwol
5
WTF? @Zack vous avez absolument raison sur les vérifications des certificats. Lorsque votre administrateur dit que vous devez désactiver les vérifications de certificats, il peut également désactiver TLS sur le serveur, car tout le monde désactive la protection contre une attaque de type "man-in-the-middle".
Rudi
@Rudi, est-ce toujours le cas s'ils utilisent une adresse IP pour accéder au serveur? (Il semble que la recherche DNS est la façon dont MITM se situe entre les deux, donc je pense que l'adresse IP devrait être immunisée contre cela.)
Chris
6
@Chris Oui, c'est toujours le cas. Un routeur MITM peut prétendre être n'importe quelle adresse IP de son choix. (Vous connaissez ces pages interstitielles que vous obtenez sur le wifi gratuit de l'aéroport? Ce sont des MITM. Essayez parfois d'accéder à une page par adresse IP.)
zwol

Réponses:

295

Brièvement:

  1. Obtenez le certificat auto-signé
  2. Mettez-le dans un ~/git-certs/cert.pemfichier (par exemple )
  3. Définir gitpour approuver ce certificat à l'aide du http.sslCAInfoparamètre

En plus de détails:

Obtenez un certificat auto-signé du serveur distant

En supposant que l'URL du serveur est repos.sample.comet que vous souhaitez y accéder via le port 443.

Il existe plusieurs options, comment l'obtenir.

Obtenir un certificat en utilisant openssl

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

Capturez la sortie dans un fichier cert.pemet supprimez tout sauf une partie entre (et y compris) -BEGIN CERTIFICATE-et-END CERTIFICATE-

Le contenu du fichier résultant ~ / git-certs / cert.pem peut ressembler à ceci:

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

Obtenez un certificat à l'aide de votre navigateur Web

J'utilise Redmine avec les référentiels Git et j'accède à la même URL pour l'interface utilisateur Web et pour l'accès en ligne de commande git. De cette façon, j'ai dû ajouter une exception pour ce domaine dans mon navigateur Web.

En utilisant Firefox, je suis allé sur, j'ai Options -> Advanced -> Certificates -> View Certificates -> Serverstrouvé l'hôte auto-signé, Exportje l'ai sélectionné et en utilisant le bouton, j'ai obtenu exactement le même fichier, créé avec openssl.

Note: j'ai été un peu surpris, il n'y a pas de nom de l'autorité visiblement mentionné. C'est bon.

Avoir le certificat de confiance dans un fichier dédié

Les étapes précédentes aboutiront à avoir le certificat dans un fichier. Peu importe de quel fichier il s'agit tant qu'il est visible par votre git lors de l'accès à ce domaine. j'ai utilisé~/git-certs/cert.pem

Remarque: si vous avez besoin de plus de certificats auto-signés de confiance, placez-les dans le même fichier:

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

Cela fonctionnera (mais je ne l'ai testé qu'avec un seul certificat).

Configurer git pour faire confiance à ce certificat

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

Vous pouvez également essayer de faire cela à l'échelle du système, en utilisant --systemau lieu de --global.

Et testez-le: vous pourrez désormais communiquer avec votre serveur sans recourir à:

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

Si vous avez déjà défini votre git sur l'ignorance des certificats SSL, désactivez-le:

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

et vous pouvez également vérifier que vous avez tout fait correctement, sans fautes d'orthographe:

$ git config --global --list

ce qui devrait lister toutes les variables que vous avez définies globalement. (J'ai mal orthographié http à htt).

Jan Vlcinsky
la source
1
je pense que cette réponse est plus correcte et complète que celle acceptée. merci @Jan Vlcinsky
Alfredo Cavalcanti
1
Après cela, les certificats signés par l'autorité habituels cessent de fonctionner, je ne peux donc pas extraire par exemple de Github. Existe-t-il un moyen d'ajouter un certificat auto-signé sans désactiver les certificats signés par l'autorité?
Michael Ivko
4
Solution @MichaelIvko qui prend en compte les `` certificats signés par l'autorité habituels '' décrits ici (vous devez ajouter votre certificat au fichier `` curl-ca-bundle.crt ''): blogs.msdn.com/b/phkelley/archive/2014/
01/20
3
Le problème avec cette approche est qu'elle supprime efficacement toutes les autorités de certification par défaut fournies avec git (par exemple, après avoir fait cela, vous ne pourrez pas extraire de github). Ce n'est probablement pas ce que la plupart recherchent. Un meilleur exemple consiste à ajouter la nouvelle autorité de certification racine à une copie de Git \ bin \ curl-ca-bundle.crt, puis à référencer la nouvelle copie de curl-ca-bundle.crt à partir de votre gitconfig.
crimbo le
3
ça marche sur Windows! exportez tous les certificats de la chaîne de certificats en tant que fichier X.509 codé en Base64 (.CER) Mettez tous les fichiers ensemble et référencez ce fichier. Assurez-vous que vous n'avez pas d'espaces dans le chemin du fichier cert (utilisez les chemins oldschool)
pscheit
3

Réglages utilisateur OSX.

Suivre les étapes de la réponse Acceptée a fonctionné pour moi avec un petit ajout lors de la configuration sur OSX.

J'ai mis le cert.pemfichier dans un répertoire sous mon utilisateur connecté OSX et m'a donc amené à ajuster l'emplacement du certificat de confiance.

Configurez git pour faire confiance à ce certificat:

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