Aller au contenu
ecdsa.com
Git commit signing with GnuPG 2Git

Message d’erreur

gpg: signing failed: Inappropriate ioctl for device

Également affiché sous la forme

  • [GNUPG:] FAILURE sign 83918950

Git l’affiche sous « error: gpg failed to sign the data ». Avec `--status-fd`, gpg émet aussi `[GNUPG:] FAILURE sign 83918950` (le code d’erreur numérique de GPG pour cette situation).

Git commit signing with GnuPG 2 — pinentry has no terminal

Ce que cela signifie

La clé de signature est protégée par une phrase de passe ; gpg-agent a lancé un pinentry en mode terminal pour la demander, et pinentry n’a pas pu ouvrir de terminal. « Inappropriate ioctl for device » est l’erreur `ENOTTY` du système d’exploitation : stdin n’est pas un TTY et `GPG_TTY` n’en désigne aucun. La clé et la configuration sont correctes ; seule la demande de phrase de passe a échoué.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Exporter GPG_TTY

    Ajoutez-le à votre profil de shell ; si l’agent en cours d’exécution a été lancé depuis un autre terminal, mettez-le à jour avec `updatestartuptty`.

    bash
    # ~/.bashrc or ~/.zshrc
    export GPG_TTY=$(tty)
    # if gpg-agent was started before, tell it about the current terminal
    gpg-connect-agent updatestartuptty /bye
  2. 2.

    Utiliser un pinentry graphique

    `pinentry-mac`, `pinentry-gnome3` ou `pinentry-qt` affichent une boîte de dialogue, ce qui fonctionne aussi avec les IDE.

    bash
    # macOS (Homebrew): a GUI pinentry works for IDEs and GUI Git clients too
    brew install pinentry-mac
    echo "pinentry-program $(brew --prefix)/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf
    gpgconf --kill gpg-agent
  3. 3.

    Pinentry en mode loopback pour l’automatisation

    Avec `allow-loopback-pinentry`, gpg peut lire la phrase de passe dans un fichier. Utilisez une clé dédiée à la CI et réservée à la signature, jamais une clé personnelle.

    bash
    # CI: a dedicated signing key; passphrase supplied non-interactively via loopback pinentry
    echo "allow-loopback-pinentry" >> ~/.gnupg/gpg-agent.conf && gpgconf --kill gpg-agent
    cat > /usr/local/bin/gpg-ci <<'EOF'
    #!/bin/sh
    exec gpg --batch --pinentry-mode loopback --passphrase-file "$GPG_PASSPHRASE_FILE" "$@"
    EOF
    chmod +x /usr/local/bin/gpg-ci
    git config --global gpg.program gpg-ci

Erreurs associées

Parcourir toute la base de données des erreurs de signature