web-dev-qa-db-fra.com

Comment signer des validations git depuis un IDE comme IntelliJ?

Question Comment signer des validations git en utilisant un IDE comme IntelliJ sous Windows?

Si vous êtes intéressé, lisez ce que j'ai essayé ici:

J'ai suivi principalement Le guide de Github . Je me suis assuré de ne pas oublier de redémarrer bash/IntelliJ après avoir modifié les fichiers de configuration.

  1. Générez une nouvelle paire de clés GPG
  2. Ajoutez la clé GPG à mon compte GitHub
  3. Associez un e-mail vérifié (par GitHub) à ma clé GPG où je me suis assuré que l'e-mail dans mon .gitconfig Est le même.
  4. Parlez à Git de ma clé GPG
  5. Signez un commit avec GPG et confirme qu'il a été vérifié sur Github.
  6. À partir de cette même page, j'ai défini les commits à signer par défaut avec git config --global commit.gpgsign true (J'utilise git 2.12). J'ai effectué un nouveau commit et vérifié qu'il était signé avec git verify-commit HEAD
  7. Lorsque j'essaie de valider dans IntelliJ, j'obtiens gpg: cannot open tty 'no tty' Donc j'ai trouvé IntelliJ ne parvient pas à valider les modifications lors de la tentative de signature de commit (GPG) et ajouté no-tty À mon fichier C:\Users\username\.gnupg\gpg.conf et redémarré.

  8. Ensuite, j'obtiens l'erreur gpg: Sorry, no terminal at all requested - can't get input Qui semble raisonnable car je viens d'ajouter l'option qui a quelque chose à voir avec aucun terminal. Comme gpg: Désolé, aucun terminal du tout demandé - ne peut pas obtenir d'entrée dit que la solution est de supprimer le no-tty Qui, je l'espère, ne s'applique pas à mon cas.

  9. D'autres réponses à la première question suggèrent d'ajouter également use-agent Dans le fichier gpg.conf, Ce qui entraîne l'erreur supplémentaire gpg: gpg-agent is not available in this session. Ah attendez, j'ai peut-être besoin de configurer gpg-agent.

  10. Le meilleur guide pour Windows que j'ai pu trouver était le Archlinux wiki (ouais, à droite). Il spécifie d'ajouter à C:/Users/username/.gnupg/gpg-agent.conf Le temps de vivre, donc je crée ce fichier et j'ajoute default-cache-ttl 34560000 Et max-cache-ttl 34560000 Selon https: //superuser.com/ questions/624343/keep-gnupg-credentials-cached-for-whole-user-session

  11. Maintenant, commençons réellement cet agent gpg, https: //superuser.com/questions/1153101/why-does-git-complain-that-no-gpg-agent-is-running made je vérifie qu'effectivement gpg-agent --version était bien plus récent que gpg --version, donc je voudrais avoir gpg2 pour pouvoir exécuter git config --global gpg.program gpg2.

  12. Mais je n'ai pas de gpg2 disponible sur la ligne de commande. J'ai installé Gpg4win (versions binaires, en bas) et même Gnupg 2 séparément mais cela ne m'a pas donné gpg2 sur la ligne de commande, j'ai remarqué que je devais placer le dossier GNU dans mes Program Files (x86) que je pense que je devrais avoir. Avec where gpg, J'ai découvert qu'il ne pointait pas du moins le gpg que je venais de télécharger, car celui-ci était en deuxième position. J'ai donc pointé git vers la droite avec git config --global gpg.program 'C:\Program Files (x86)\GnuPG\bin\gpg.exe'

  13. Maintenant, j'ai l'erreur gpg: skipped "keyid": secret key not available. La solution dans gpg: sauté "N": clé secrète non disponible est ce que je viens de faire, donc cela n'aide pas. Puis j'ai réalisé que j'avais tout configuré avec l'autre gpg, pas avec celui-ci. J'ai fait alias gpg="'C:\Program Files (x86)\GnuPG\bin\gpg.exe'", vérifié gpg --version Et refait le tout. En fait, je mets la ligne d'alias dans mon .bash_profile Donc je n'ai pas besoin de l'exécuter à chaque fois.

  14. Lorsque j'essaie gpg --gen-key, Il se bloque immédiatement. Je ne sais pas pourquoi, je ne pense pas que le problème ne soit pas assez d'entropie car l'ancien gpg a bien fonctionné mais il est possible que la nouvelle version nécessite plus d'entropie. En tout cas, je n'ai trouvé aucun utilisateur Windows avec le même problème sur Internet.

  15. Ça marche! Lorsque je valide dans IntelliJ, il ne demande ma phrase secrète avec pinentry qu'une seule fois. Mais maintenant je ne peux pas valider depuis Git Bash, avec l'erreur no secret key Qui a du sens car comme je l'ai dit gpg --list-keys Est vide: aucune clé n'est associée à ce gpg.

  16. Intellij IDEA signer GIT s'engage avec GPG est pertinent, mais la seule réponse est pour MAC et ne semble pas s'appliquer à Windows. Cela m'a conduit à:

  17. me.m01.eu indique l'ajout d'une nouvelle variable d'environnement appelée GNUPGHOME qui pointe vers C:\Users\username\.gnupg. Ce répertoire existe, mais comme mentionné dans une réponse de la signature de git commit a échoué: clé secrète non disponible Je pense que mon nouveau gpg utilise C:\Users\username\AppData\Roaming\gnupg Donc je l'ai ajouté à la place. J'ai vérifié avec printenv GNUPGHOME Que je l'ai ajouté correctement (j'ai dû redémarrer). Mais cela n'a rien changé.

  18. Étant donné que mes clés sont dans C:\Users\username\.gnupg, J'ai essayé de pointer la variable d'environnement là-bas, mais cela n'a pas aidé, gpg --list-keys Était toujours vide. J'ai donc dû trouver une autre façon d'indiquer à gpg où se trouvent mes clés.

  19. gpg --list-keys --homedir='C:/Users/s156757/.gnupg' A donné les bonnes clés, j'ai donc décidé d'ajouter homedir C:\Users\s156757\.gnupg À mon fichier C:\Users\username\AppData\Roaming\gnupg\gpg.conf Que je devais créer. À cause de ce bug . J'ai confirmé que gpg --list-keys Avait rendu mes clés. Toujours la même erreur, l'ajout de no-tty Et use-agent À ce fichier de conf n'a pas aidé.

Je peux maintenant valider depuis IntelliJ mais plus avec Git Bash, ce qui donne skipped "keyid": No secret key.

Plus de réflexions

  1. Je n'ai pas réussi à exporter les clés de gpg vers gpg2 avec gpg --export [ID] | gpg2 --import && gpg --export-secret-keys [ID] | gpg2 --import
  2. Je pensais que Gpg4win seul pourrait peut-être être configuré, donc je n'ai pas besoin de taper mon mot de passe à chaque fois. Malheureusement, je n'ai trouvé aucun moyen de faire en sorte que Gpg4win se souvienne de ma phrase secrète.
  3. J'ai pensé plus tard, si je me souviens bien que gpg --list-secret-keys N'a jamais rien retourné pour gpg 2. J'ai découvert plus tard que cette commande était différente de gpg --list-keys.

En bref, c'est le principal problème: gpg-agent permet la mise en cache des phrases secrètes mais la version gpg de git ne correspond pas à la version gpg-agent, vous devez donc installer le bon gpg 2 vous-même en premier. Mais je n'ai pas réussi à faire cette installation de telle manière que je pouvais valider depuis Git Bash et IntelliJ.

19
PHPirate

IDEA n'est pas un terminal et ne peut pas gérer la signature pour le moment. Voir https://youtrack.jetbrains.com/issue/IDEA-127802 .

Il existe cependant une solution de contournement, vérifiez le https://youtrack.jetbrains.com/issue/IDEA-127802#comment=27-1866498

11
Dmitriy Smirnov

Depuis git 2.19.1, gpg2 est supporté!

gpg-agent peut gérer la signature automatique maintenant, en se souvenant de votre phrase secrète

Cela devrait faciliter l'utilisation de gpg pour signer automatiquement les validations. Pour être exact, git version 2.19.1 a au moins gpg 2.2.9. Ces instructions ont été testées sur Windows 7, Windows 8.1, Windows 10, Arch Linux et Fedora 29.

Étapes pour configurer la signature de validation git

  1. Il est recommandé d'avoir configuré ssh, voir par ex. help.github.com/en/articles/connecting-to-github-with-ssh (également lorsque vous n'utilisez pas GitHub)
  2. Démarrez (sous Linux) un terminal ou (sous Windows) git bash, vérifiez avec git --version Que git est au moins 2.19.1 et avec gpg --version Que vous utilisez gpg2.

    Sinon, vérifiez avec where gpg (Ou which gpg Si la commande where n'est pas disponible) que le chemin le plus haut est celui de git.

    • Si vous ne voyez aucun chemin ou aucun qui a gpg2, essayez la commande gpg2 Au lieu de gpg, donc gpg2 --version. Si cela fonctionne, vous devrez désormais utiliser gpg2 Au lieu de gpg.
    • Si vous voyez un chemin git mais que ce n'est pas le premier, mettez (sous Windows) alias gpg="'C:\path\to\Git\usr\bin\gpg.exe'" Dans votre C:\Users\username\.bash_profile, Créez le fichier s'il n'existe pas et redémarrez git bash. Essayez à nouveau where gpg Et gpg --version. À partir de maintenant, où gpg est tapé dans un fichier, vous devez le remplacer par 'C:\path\to\Git\usr\bin\gpg.exe'.
  3. Vérifiez la sortie de gpg --version Si le répertoire personnel ressemble à (sous Linux) /home/username/.gnupg Ou (sous Windows) /c/Users/username/.gnupg. Ce répertoire ne doit pas encore exister.

    Si le chemin est incorrect, essayez de le changer - par exemple, une fois sous Windows, j'ai vu que mon domicile était préfixé par le chemin dans lequel j'ai exécuté la commande, j'ai donc mis un alias dans le .bash_profile Avec alias gpg="gpg --homedir=/c/Users/s156757/.gnupg" Et redémarré bash, puis vérifié à nouveau.

  4. Les prochaines étapes proviennent du bon Guide de Github , de préférence vous y vérifiez si les commandes sont toujours correctes. Tout d'abord, générer une nouvelle paire de clés GPG (mais n'installez pas les outils gnupg!): Exécutez gpg --full-generate-key
    • Sélectionnez RSA et RSA et 4096 bits.
    • Comme vrai nom, utilisez votre user.name Comme dans votre ~\.gitconfig.
    • En tant qu'e-mail, utilisez l'e-mail de user.email Dans votre ~\.gitconfig, En vous assurant que cet e-mail est un e-mail vérifié sur GitHub.
    • Si vous voulez essayer gpg-agent (vous devrez fournir votre mot de passe au moins une fois après chaque redémarrage) ou si vous êtes d'accord avec un badge 'non vérifié' sur GitHub, fournissez un mot de passe. Sinon, laissez-le vide.
  5. Chaque fois que vous souhaitez vérifier les clés dont vous disposez, utilisez gpg --list-secret-keys --keyid-format LONG. Faites-le maintenant et copiez le key_id (Comme je nommerai votre clé à partir de maintenant) de la sortie sec rsa4096/key_id 2018-10-27 [SC] ....
  6. Imprimez la clé publique avec gpg --armor --export key_id.
  7. Ajoutez la clé GPG à votre compte GitHub : accédez à Settings | SSH and GPG keys et ajoutez le bloc de clé publique (y compris l'en-tête et le pied de page).
  8. Informez Git de votre clé GPG : git config --global user.signingkey key_id.
  9. Si vous deviez utiliser l'option --homedir Auparavant, vous devez vous assurer que lorsque git démarre gpg, la maison est également correctement modifiée. Créez un fichier C:\Users\username\start-gpg.sh Et insérez-le gpg --homedir=/c/Users/s156757/.gnupg "$@". Exécutez ensuite git config --global gpg.program C:\\Users\\username\\start-gpg.sh Pour dire à git de l'utiliser.
  10. Redémarrez bash.
  11. Signez un commit avec GPG avec git commit -S -m "signed commit" Et confirmez qu'il est vérifié sur Github, vous devriez voir un petit badge lorsque vous visualisez votre commit.
  12. Définissez les validations à signer par défaut avec git config --global commit.gpgsign true. Effectuez un nouveau commit et vérifiez s'il a été signé avec git verify-commit HEAD.

Étapes pour que la signature de validation se produise automatiquement: trois options

1. Je n'ai pas de phrase secrète sur ma clé

Vous avez terminé.

2. Je veux essayer gpg-agent

Pour moi, cette option ne fonctionnait pas: je devais toujours fournir ma phrase secrète souvent, mais pas toujours. Mais en théorie, cela fonctionne:

  1. Mettez à jour l'heure du cache, dans C:\Users\username\.gnupg\gpg-agent.conf: Créez un fichier s'il n'existe pas, ajoutez default-cache-ttl 34560000 Et max-cache-ttl 34560000.
  2. Redémarrez gpg-agent en utilisant gpgconf --kill gpg-agent
  3. Vous devez maintenant saisir votre mot de passe une fois lors de la validation, puis plus. Vérifiez que votre commit est Verified sur GitHub.

3. Dirigez la phrase secrète en texte brut vers gpg

Cela signifie que vous n'avez jamais à fournir votre mot de passe, mais pour moi, cela signifie que GitHub met un badge Unverified sur ma validation. Question ici: La clé dont l'ID-clé est dans la signature n'a pas signé ce commit

  1. Si vous l'avez déjà créé, remplacez tout le contenu de C:\Users\username\start-gpg.sh Par le code ci-dessous. Si ce n'est pas le cas, créez le fichier avec le contenu ci-dessous, supprimez l'indicateur --homedir Et exécutez git config --global gpg.program C:\\Users\\username\\start-gpg.sh. Dans tous les cas, redémarrez bash.

Oui, vous allez placer votre mot de passe en clair sur votre ordinateur! Si vous connaissez une meilleure façon, veuillez laisser un commentaire ...

# Passphrase-file-descriptor is set to 0 (STDIN), to use it --batch must be used
# The --pinentry-mode loopback is required since gpg 2.1.0 for --passphrase-fd
# The "$@" makes sure that whatever git wanted gpg to do, is still done
echo mypassphrase | gpg --homedir=/c/Users/username/.gnupg --passphrase-fd 0 --batch --yes --pinentry-mode loopback "$@"
  1. Validez et envoyez et vérifiez que la phrase secrète ne vous a pas été demandée et que votre validation est toujours Verified sur GitHub.

Ancienne réponse pour les anciennes versions de git sans gpg2

Pour la référence, voici les instructions complètes, ou plutôt les étapes que j'ai faites pour le faire fonctionner quelque peu. Par "travail", je veux dire que les commits sont signés automatiquement, mais il y a deux inconvénients:

Si vous êtes bloqué, vérifiez les étapes de la question pour voir si j'ai eu le même problème.

  1. Les premières étapes sont du bon Guide de Github : Générer une nouvelle paire de clés GPG
  2. Ajoutez la clé GPG à votre compte GitHub
  3. Associez un e-mail vérifié (par GitHub) à votre clé GPG et assurez-vous que le nom et l'e-mail dans votre .gitconfig Sont les mêmes.
  4. Parlez à Git de votre clé GPG
  5. Signer un commit avec GPG et confirmer qu'il est vérifié sur Github, vous devriez voir un petit badge lorsque vous visualisez votre commit.
  6. Définissez les validations à signer par défaut avec git config --global commit.gpgsign true. Effectuez un nouveau commit et vérifiez s'il a été signé avec git verify-commit HEAD.

  7. La version gpg fournie avec git est trop ancienne, alors installez Gpg4win (versions binaires, en bas) qui devrait installer gpg 2. Avec where gpg Vous devriez voir deux chemins, dont le second est probablement votre nouveau gpg, quelque chose comme C:\Program Files (x86)\GnuPG\bin\gpg.exe. Sinon, essayez d'installer Gnupg 2 séparément de la page des téléchargements.

  8. J'ai mis alias gpg="'C:\Program Files (x86)\GnuPG\bin\gpg.exe'" pour pointer la commande gpg vers mon nouveau gpg dans mon C:\Users\username\.bash_profile, Redémarrer Git Bash et vérifier avec gpg --version Que j'utilise maintenant gpg 2.

  9. Ajoutez une nouvelle variable d'environnement appelée GNUPGHOME qui pointe vers C:\Users\username\.gnupg. Redémarrez et vérifiez avec printenv GNUPGHOME Que vous l'avez ajouté correctement.

  10. Créez un script C:\Users\username\gpg-no-tty.sh Et mettez-y echo passphrase | "C:\Program Files (x86)\GnuPG\bin\gpg.exe" --passphrase-fd 0 --batch --no-tty --yes "$@"

    La raison pour laquelle vous mettez votre phrase secrète en texte clair ici est que l'option --batch, Qui fait que tout fonctionne, a besoin de la phrase secrète. Pour moi, il semble qu'il devrait exister une meilleure solution que d'enregistrer votre phrase secrète en texte brut sur votre ordinateur, veuillez donc laisser un commentaire si vous avez trouvé quelque chose de mieux.

  11. Pointez git sur ce script avec git config --global gpg.program C:\\Users\\username\\gpg-no-tty.sh.

  12. Maintenant, testez à la fois dans Git Bash et IntelliJ que vous pouvez valider et vérifiez que cela a fonctionné en faisant git verify-commit HEAD.

19
PHPirate