web-dev-qa-db-fra.com

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

L'administrateur système d'un projet sur lequel je travaille a décidé que SSH constituait "trop ​​de problèmes"; au lieu de cela, il a configuré Git pour qu'il soit accessible via une URL https:// (et une authentification 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, dans tout référentiel distant commençant par https://$SERVERNAME/), il doit accepter un certificat particulier, et niquement ce certificat? Redupliquez fondamentalement le comportement de la clé de serveur SSH.

143
zwol

Brièvement:

  1. Obtenez le certificat auto-signé
  2. Placez-le dans un fichier (par exemple ~/git-certs/cert.pem)
  3. Définissez git pour faire confiance à ce certificat à l'aide du paramètre http.sslCAInfo

En plus de détails:

Obtenir un certificat auto-signé du serveur distant

En supposant que l'URL du serveur soit repos.sample.com et que vous souhaitiez y accéder via le port 443.

Il y a plusieurs options, comment l'obtenir.

Obtenir un certificat en utilisant openssl

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

Saisir la sortie dans un fichier cert.pem et supprimer tout sauf une partie comprise 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-----

Obtenir un certificat en utilisant 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é à Options -> Advanced -> Certificates -> View Certificates -> Servers, j'ai trouvé l'hôte auto-signé, je l'ai sélectionné et en utilisant le bouton Export, j'ai exactement le même fichier que celui créé avec openssl.

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

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

Les étapes précédentes doivent avoir pour résultat 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 davantage de certificats auto-signés, 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).

Configurez git pour faire confiance à ce certificat

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

Vous pouvez également essayer de faire ce système dans son ensemble, en utilisant --system au lieu de --global.

Et testez-le: vous pourrez maintenant communiquer avec votre serveur sans avoir recours à:

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

Si vous avez déjà paramétré votre ignorance sur les certificats SSL, désactivez-le:

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

et vous pouvez aussi vérifier que vous avez tout fait correctement, sans faute 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).

260
Jan Vlcinsky

Selon cette page sur aeminium.org vous devez ajouter un élément de configuration http.sslCAInfo ou http.sslCAPath à .git/config, qui contient le certificat du serveur Web.

6
Rudi

Réglages utilisateur OSX.

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

J'ai placé le fichier cert.pem dans un répertoire sous mon utilisateur OSX connecté, ce qui m'a 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

1
Chris Langston