Gitエラー-gpgがデータに署名できませんでした


149

私はgitを使い始めたばかりで、homebrewを介してgitとgpgをインストールしています。何らかの理由で、git commit このトピックに関する他の多くのスタックオーバーフローの質問を調べたときに、このエラーが発生しました。このエラーを修正して、正常にアップロードできるようにするにはどうすればよいですか。

error: gpg failed to sign the data
fatal: failed to write commit object

3
Macユーザー向け。私はこの問題を抱えていました。このページのアドバイスは、gpgの2つのバージョンがインストールされている可能性があることを理解するのに役立ちました。1つは醸造所から、もう1つはGPGスイートからです。システムのキーチェーンでパスフレーズをキャッシュできるため、GPG Suiteを使用したかったのです。抽出バージョンをアンインストールすると問題が解決しました。@sideshowbarkerのgpg-agentの強制終了に関する回答とともに。だから私はそれぞれの設定が互いに干渉していると思います。
マイケルウェルチ



私はちょうどgpg署名に関する問題に遭遇しました。問題は、私のgitリポジトリにローカルのgpg.signingkeyセットがなかったのですが、gllobalはそうでした。したがってgit config --local user.signingkey、正しいキーに設定するだけで、再度自動署名されます。多分に世界1の設定を解除git config --global --unset user.signingkey
MarcusJ

回答:


210

トラブルシューティングのために、最初に試す2つのこと:

  • 実行しgit config --global gpg.program gpg2てくださいGitの用途を作るために、gpg2そしてありませんgpg
  • run echo "test" | gpg2 --clearsigngpg2それ自体が機能していることを確認する

それで問題がなければ、次のことを試してください。

  • brew install pinentryパスフレーズを入力するための適切なツールがインストールされていることを確認するために実行します

インストール後、再試行git commitしても「failed to sign the data」エラーが発生する場合:

  • 実行中のgpgconf --kill gpg-agentハングしている可能性のあるエージェントを強制終了します

それが言う場合はgpgconfインストールされていないか、持っていない--killオプションは、あなたがかもしれない、これを試してみてください。

  1. cp ~/.gnupg ~/.gnupg-GOODコピーを保存して、~/.gnupg必要に応じて後で復元する
  2. brew install gnupg21 GnuPG 2.1をインストールするには

あなたのコピーを保存するための理由~/.gnupgDIRはGnuPGの2.1が潜在的に作成することです/ので、GnuPGの2.0との下位互換性およびそれ以前ではない方法で、いくつかの重要なデータを変更する場合は、あなたが後で戻りたい、あなたが行うことができますmv ~/.gnupg ~/.gnupg21 && mv ~/.gnupg-GOOD ~/.gnupg


それ以外の場合は、GnuPG環境が機能していることを確認するために実行するいくつかの基本的な手順があります。

  • runを実行しgpg2 -K --keyid-format SHORTて、少なくとも1つの鍵ペアがあることを確認します

その出力にGnuPGで使用する秘密鍵がないことが示されている場合は、作成する必要があります。

  • を実行gpg2 --gen-keyして、GnuPGに鍵ペアを作成する手順を説明します。

「デバイスに対して不適切なioctl」というエラーメッセージが表示された場合は、次の操作を行います。

  • 実行export GPG_TTY=$(tty)する~/.bashrcか、またはそれをorに追加します˜/.bash_profile

2番目のコマンドを実行すると、このエラーが発生します:gpg:デフォルトの秘密鍵なし:秘密鍵なしgpg:[stdin]:clearsign failed:No secret key
Entitize

@Entitizeこれは、gpgが署名に使用するキーがないと考えていることを示しているようです。回答に追加した追加の手順を参照してください。これまでに実行したことがない場合はgpg2 --gen-key、それを最初に実行する必要があります。
sideshowbarker

2
echo "test"を実行すると| gpg2 --clearsign、それは私に与えます:gpg-agent [-]:コマンドget_passphrase失敗:デバイスの不適切なioctl gpg:エージェントの問題:デバイスの不適切なioctl gpg:デフォルトの秘密鍵なし:操作はgpgをキャンセルしました:[stdin]: clearsign failed:操作はキャンセルされました。他にも多くの可能性を試してみましたが、どれもうまくいきませんでした。GPGなしでGITを使用する方法はありますか?
16

9
あなたは試すかもしれませんexport GPG_TTY=$(tty)。gpgなしでgitを使用する方法があるかぎり、デフォルトで実行git config --global commit.gpgsign falseするか、コミットをグローバルに設定解除するgpg署名を実行するだけで実行できるはずです。
sideshowbarker

10
ここでMac OS Xでデバッグを開始しecho "test" | gpg2 --clearsign、エラーを見つけて、このスレッドに導いて、問題を解決しexport GPG_TTY=$(tty)ました。˜/.bash_profileファイルにを入れてリロードしただけですsource ˜/.bash_profile
herrera

71

Gitは、どの鍵で署名しているかを知る必要があります。

GPG、gpg-agent、およびgpg.confファイル(このガイドを参照)をセットアップしたら、次を実行する必要があります。

git config --global user.signingkey EB11C755

もちろん、最後の公開鍵を自分のものに置き換えます。デフォルトですべてのコミットに署名する場合は、

git config --global commit.gpgsign true

7
他の誰かが私がやったことをするのに十分愚かだった場合に備えて、これに遭遇しました:「signinkey」ではなく「signingkey」と綴ってください。
ZNK 2017年

1
文字通り@ZNKによるこのコメントは私のためにそれをしました。「signingkey」の代わりに「signkey」と
つづりました

1
受け入れられた答えは、これを最初のトラブルシューティング手順として引用する必要があります。すべてのキーがすでに配置されている場合があるため、使用するキーをgitが忘れてしまうためです。
f055

41

どういうわけかあなたのgitはすべてのコミットにGPG署名するように設定されています。GPGでの署名は、gitを使用してコミットまたはプッシュする必要はありません。gpg署名メカニズムがまだ設定されていないため、エラーが発生している可能性があります。

初めてgitを使用する場合は、最初にGPG署名なしで最初に動作するようにしてください。本当に必要な場合は、後で署名を追加してください。

あなたはあなたのgitがgpgに関してどのように設定されているかを確認することができます:

git config -l | grep gpg

以下を含むゼロ以上の行を生成する可能性があります。

commit.gpgsign=true

「commit.gpgsign」がtrueの場合、gpg署名が有効になっています。それを無効にする:

git config --global --unset commit.gpgsign

次に、もう一度コミットを実行してみてください。これで、gpg署名なしで実行できるようになります。基本的なgitが機能するようになったら、gpg署名をミックスに追加してみてください。


12
驚くばかり!git config --global --unset commit.gpgsign私のために働いた:)
hpaknia

ワオ!!それは私のために働いた:git config --global --unset commit.gpgsign
Hardy Mathew

32

@sideshowbarkerと@Xavier Hoソリューションを参照して、次の手順で問題を解決しました。

brewによってインストールされたgpg2を想定します。

git config --global gpg.program gpg2
brew install pinentry
gpgconf --kill gpg-agent
gpg2 -K --keyid-format SHORT
// no key found then generate new one
gpg2 --gen-key

gpg2 -K --keyid-format SHORT 

... /。gnupg / pubring.gpg

秒rsa2048 / 0A61C6FC 2017-06-29 [SC] [有効期限:2019-06-29]

git config --global user.signingkey 0A61C6FC

同僚に思い出させて、追加する必要がある

export GPG_TTY=$(tty)

zshを使用する場合は〜/ .zshrcに、それ以外の場合は〜/ .bash_profileに追加


macOSの場合

gpg2はbpgでgpgと組み合わされているため、gpgコマンドはgpg2を指しています。

brew install gpg2

醸造情報gpg

gnupg:安定2.2.6(ボトル入り)

git config --global gpg.program gpg
gpg -K --keyid-format SHORT 

パスフレーズエントリ用のpinentry-macがあります

brew install pinentry-mac
vim ~/.gnupg/gpg-agent.conf

行を追加

pinentry-program / usr / local / bin / pinentry-mac


1
macOS 10.15(Catalina)にはGnuPGバージョン2.2.17が同梱されているため、自分でアップデートを管理する予定がない限り、個別にインストールする必要はありません。
Josh Habdas

18

使っています。zshaをサポートし、LinuxのWindowsサブシステムで動作します。

export GPG_TTY=$(tty)

2
私はMacOS Catalinaでzshを使用していますが、これが機能するために必要な唯一の変更点でした。ありがとう。
JP Lew

キーをWSL環境にコピーした後、OPでエラーを受け取りました。キーのパスフレーズのプロンプトを提供するためにこれを実行する必要があることがわかりました。ありがとう。
narwic

10

キーの有効期限が切れていないか確認してください。有効期限を修正すると(必要でない限り、新しいキーを作成する必要はありません)、git通常どおり機能します。

期限切れのキーを修正する1つの方法:

(注:$コマンドラインプロンプトを表します。プロンプトの後にコマンドを入力します。各コマンドの後にEnterキーを押します)

$ gpg2 --list-keys適切なキーIDを検索し(後に文字\pub行)

$ gpg2 --edit-key <key id> -これにより、gpgシェルが開き、プロンプトが次のように変更されます。 gpg>

gpg> expire -主キーの新しい有効期限を設定するための指示に従います

次に、期限切れのサブキーがある場合(sub行に表示)、それらの有効期限もリセットします。

gpg> key 1-最初のサブキーを選択しますgpg> expire-指示に従ってサブキーの 新しい有効期限を設定します

必要に応じて、後続のサブキーごとに繰り返します。


有効期限のないgpgキーを実行しようとするたびに、この問題が発生しました。なんらかの理由でgitはそれを好まない。この方法を使用して有効期限を追加すると(どれだけ遠くても)、問題が解決するようです。
some_guy632

save完了したら、gpgプロンプトで入力することを忘れないでください!
daviewales

5

これはubuntu 18.04で私のために働きました

gpgキーを確認する

gpg -K --keyid-format LONG

空の応答を受け取った場合は、GPGキーを生成します

gpg --generate-key

最初のコマンドを再実行すると、次のような出力が得られます。

sec   rsa3072/95A854E0593B3214 2019-05-06 [SC] [expires: 2021-05-05]
      AF2F7514568DC26B0EB97B9595A854E0593B74D8
uid                 [ultimate] yourname<your_email>
ssb   rsa3072/EFD326E6C611117C 2019-05-06 [E] [expires: 2021-05-05]

git歌声キーを設定する

git config --global user.singingkey 95A854E0593B3214

その後、あなたは行ってもいいです!(--globalはオプションです)

または、sshキーで署名してもかまわない場合

git config commit.gpgsign false

ここここのこの質問によるセキュリティ問題のため、これは推奨されないことに注意してください


「あるいは、sshキーで署名してもかまわない場合」sshは署名とどのように関係していますか?
riffraff

SSHはコミットの署名とは何の関係もありません。彼らはGPGコミット署名をオフにすることを言及しており、実際にコミットをGitサーバーにプッシュするときにSSHキーを使用して認証することに依存しています。SSH認証を使用して、未署名のコミットをプッシュすることができます(これは非常に一般的です)。
phouse512

4

私はgpg.programをgpgへの絶対パスに修正する必要がありました:

git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"

cygwinでWindowsを使用しています。


3
これが私の解決策でした。チョコレートを使用してgnupgをインストールしました。
Alex S

ありがとう、私のためにも働いた。私がやったchoco install gpg4win
Gokul NC

4

解決:

Issue: Disabled loopback pinentry mode

この問題を解決するには、〜/ .gnupg / gpg.confでループバックpinentryモードを有効にする必要があります:

cat <<'EOF' >> ~/.gnupg/gpg.conf

use-agent 
pinentry-mode loopback

EOF

また、〜/ .gnupg / gpg-agent.confにもあります(ファイルが存在しない場合は作成します)。

cat <<'EOF' >> ~/.gnupg/gpg-agent.conf

allow-loopback-pinentry

EOF

次に、エージェントを再起動しecho RELOADAGENT | gpg-connect-agentます。これで問題ありません。

ソース


1
うわー、すべての可能な解決策を何時間も費やした後、これは私の問題を解決しました。
Matt

どういたしまして。ソースに実際に感謝します。私もこれで行き詰まりました。
Rahul Thakur

3

このエラーは、GPGキーの有効期限が切れた場合にも発生する可能性があります。新しいキーを生成してGitに追加すると、これが解決します。


3

gnupg 2.xにアップグレードした後、この問題が発生しました。それはgpg2が異なっキーを参照していることがわかるでしょう:私はまだ持っていたsigningkey = ABC98F11私に(GPG v1の設定)~/.gitconfig。gpg2のキー識別子は長くなっています。それらを調べるgpg --list-secret-keys


1

私は/ /のgit3つの別々のキーでキーを作成しました&&(数日間正常に動作した後)キーが期限切れとして表示されました:certifysignencrypt

pub   rsa4096/4CD1E9DA 2017-04-26 [C] [expired: 2017-04-28]
      Key fingerprint = 4670 59C1 7592 08B8 7FA5  313B 2A42 B6A6 4CD1 E9DA
uid         [ expired] Stuart Cardall (GIT Development Keys) <xxxxxx>
sub   rsa4096/5195E715 2017-04-26 [E] [expired: 2019-04-26]
sub   rsa4096/DB74C297 2017-04-26 [S] [expired: 2019-04-26]
sub   rsa2048/A3913A3C 2017-04-28 [] [expired: never     ]

問題を解決するために個別のサブキーを追加せずに新しいキーを作成しました。


1

あなたのGit設定がgpgsign = trueに設定された可能性があります。コミットを割り当てたくない場合は、falseに設定してみてください。リポジトリフォルダーに移動し、ファイルを変更します

nano .git / config

これから...

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@bitbucket.org:yourrepo/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[user]
    signingkey = <GPG-KEY>
[commit]
    gpgsign = true

これに...

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@bitbucket.org:yourrepo/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[user]
    signingkey = <GPG-KEY>
[commit]
    gpgsign = false

1

私にとって、リモートアクセスを容易にするために(を使用して)git tag -sに切り替えたときに、Debian GNU / Linuxでこのエラーが発生し始めました。これはでのみ発生し、(例えばpinentry-gnome3pinentry-cursesupdate-alternatives --config pinentrygit tag -sgpggpg --clearsign)自体です。

この場合に再び機能させるために必要な唯一の変更はexport GPG_TTY=$(tty)、シェルのスタートアップファイルに追加することでした。

この質問に対する別の回答で、この修正の指標として言及されている「デバイスに不適切なioctl」エラーメッセージが表示されませんでした。

注:このエラーが発生する原因は、export GPG_TTY=$(tty)この質問に対する他の回答で以前に(通常は副次的なヒントとして)提案したものとはまったく異なるため、この質問にはexport GPG_TTY=$(tty)、主な修正である可能性があると述べている別の回答が必要であると判断しました。場合によっては唯一必要なもの。


ありがとう!update-alternatives --config pinentry私のためにやった。私はデスクトップにSSHで接続され、pinentryに設定されました/usr/bin/pinentry-gnome3(SSHが接続されたとき、または仮想コンソールに切り替えられたときに、TTYフォールバックが必要です)。しかし、それは明らかに機能していませんでした。デフォルトを設定/usr/bin/pinentry-ttyして私のためにトリックを行いました。デスクトップに戻ったときに設定し直す必要があるかもしれませんが、今のところ、問題ありません。export GPG_TTY=$(tty)十分ではなかった。私はそれを行いましたがpinentry、コミットに署名する前に切り替える必要がありました。
Karl Wilbur

1

私にとってそれを解決したのは、キーの名前が私のgitユーザー名と一致することを確認することでした。メールも一致する必要があると思います。これは、MacでGPG KeyChainを使用している場合に発生する可能性があります。わからない。

入力時にキーに名前を付けていると思いましたが、自分の名前(gitユーザー名)を入力するよう求められていたようです。

GPGキーチェーンフォーム


この回答が非常に遅れているのは残念ですが、多くの人が問題を探しにここに来ることはありません。
MaciekS

1

macosでこのエラーが発生しました-キーを一覧表示して、有効期限が切れていないかどうかgpg2 --list-keysを確認してみました-キーの有効期限が切れておらず、を使用して適切なキーが設定に設定されていることを確認しましたgit config --global user.signingkey

これらのコマンドを実行した後、突然、問題なく署名済みコミットを再度実行できるようになりました。設定ファイルやキーは変更しませんでした。新しいターミナルインスタンスを作成していません。Macでgpg2がどういうわけか奇妙な状態にあるように見えました。


0

私は、インストールの問題を解決しbrew install gpg2、次にやっgit config --global gpg.program gpg2


0

git設定でキーの有効期限が切れている場合にも、同じエラーが発生する可能性があります。

の内容を確認して値をcat .git/config探し、signingkey有効期限が切れていないか確認してください。はいの場合は、新しいもので更新します。


0

スマートカード/ユビキーを使用してGPGキーをsignkey保存し、カードに保存されているキーでgit configを設定した場合(上記のすべての回答で問題が解決されないようです)、ブロックされたカードのPINがこの問題の根本的な原因。

ブロックされたPINを確認するには:

gpg --card-status

カウンターが

Reader ...........: Yubico YubiKey
PIN retry counter : 3 0 3

次に、PINがブロックされます(3回失敗した後)。

PINのブロックを解除するには:

gpg --card-edit
gpg/card> admin
Admin commands are allowed

gpg/card> passwd
gpg: OpenPGP card no. … detected

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection? 2
PIN unblocked and new PIN set.

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection? q

0

私にとっては、単純なbrew unintstall gnupg && brew cask reinstall gpg-suite問題を解決します。

(私の場合)手動で自作インストールされたgpgをアンインストールし、GPG Suite全体を再インストールします。


0

私の場合、コミット署名のドキュメントでhttps://help.github.com/en/github/authenticating-to-github/telling-git-about-your-signing-に gpg構成とsmimesign構成が混在していたキー

数時間作業した後、私はそれを修正する最良の方法は、gpgに関連するすべての設定を解除し、gpgを再構成することであるとわかりました。

@Jason Thrasherの回答で述べたように、次を使用してgpgに関連するすべてのgit構成を見つけます。

git config -l | grep gpg

次に、次のようにローカルで使用するだけでなく、すべてを不安定にします:

git config --global --unset <config_name>
git config --local --unset <config_name>

次に、上記の公式ドキュメントに従って再構成します。お役に立てれば。


また、私はgpg2を使用しています
Shubham Gupta

0

以前にpinentryとgpgをセットアップしていて、どこからともなく機能しなくなった場合:

gpgが機能するかどうかを確認します。

echo "test" | gpg --clearsign

と表示されている場合はgpg: signing failed: No pinentry、gpgデーモンクライアントを再起動してください。

gpgconf --kill gpg-agent

これで動作するはずです:

echo "test" | gpg --clearsign

0

私の場合、このエラーは、パスフレーズプロンプトに適合できないgit commit小さなtmuxウィンドウで実行しているときに発生しました。

$ echo "test" | gpg --clearsign
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

test
gpg: signing failed: Screen or window too small
gpg: [stdin]: clear-sign failed: Screen or window too small

-6

これはあなたがそれを取り除くのに役立ちます

git config commit.gpgsign false


1
反対票は理解できません。提案された問題は私の魅力のように解決されました。
Jms

2
このコマンドは避けてください。git commitに署名する必要がなくなるだけで、commitしている人を認証する問題は解決されません。
カイル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.