Zum Inhalt springen
ecdsa.com
Git commit signing with GnuPG 2Git

Fehlermeldung

gpg: signing failed: Inappropriate ioctl for device

Auch ausgegeben als

  • [GNUPG:] FAILURE sign 83918950

Git gibt die Meldung unter „error: gpg failed to sign the data“ aus. Mit `--status-fd` gibt gpg zusätzlich `[GNUPG:] FAILURE sign 83918950` aus (den numerischen GPG-Fehlercode für diesen Zustand).

Git commit signing with GnuPG 2 — pinentry has no terminal

Was der Fehler bedeutet

Der Signaturschlüssel ist durch eine Passphrase geschützt, gpg-agent hat ein Pinentry-Programm für das Terminal gestartet, um sie abzufragen, und dieses konnte kein Terminal öffnen. „Inappropriate ioctl for device“ ist `ENOTTY` des Betriebssystems: stdin ist kein TTY, und `GPG_TTY` benennt keines. Schlüssel und Konfiguration sind in Ordnung; nur die Abfrage der Passphrase ist gescheitert.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    GPG_TTY exportieren

    Trage den Export in dein Shell-Profil ein; wurde der laufende Agent aus einem anderen Terminal gestartet, aktualisiere ihn mit `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.

    Grafisches Pinentry-Programm verwenden

    `pinentry-mac`, `pinentry-gnome3` oder `pinentry-qt` zeigen einen Dialog an, der auch mit IDEs funktioniert.

    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.

    Loopback-Pinentry für die Automatisierung

    Mit `allow-loopback-pinentry` kann gpg die Passphrase aus einer Datei lesen. Verwende für die CI einen eigenen Schlüssel, der nur zum Signieren dient, nie einen persönlichen Schlüssel.

    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

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen