web-dev-qa-db-ja.com

gpgが致命的なデータの署名に失敗しました:コミットオブジェクトの書き込みに失敗しました[Git 2.10.0]

私は Git 2.10 リリースノートの pretty 属性に関するいくつかの記事を追っていました。どんどん進んでgitを2.10.0にアップグレードし、グローバル.gitconfigに変更を加えました。

[filter "lfs"]
    clean = git-lfs clean %f
    smudge = git-lfs smudge %f
    required = true
[user]
    name = xyz
    email = [email protected]
    signingkey = AAAAAAA
[core]
    excludesfile = /Users/xyz/.gitignore_global
    editor = 'subl' --wait
[difftool "sourcetree"]
    cmd = opendiff \"$LOCAL\" \"$REMOTE\"
    path = 
[mergetool "sourcetree"]
    cmd = /Applications/SourceTree.app/Contents/Resources/opendiff-w.sh \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\"
    trustExitCode = true
[alias]
    lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
[color "diff"]
    old = red strike
    new = green italic

しかし今、私は自分のコミットに署名しようとしている

git commit -a -S -m "message"

私は次のエラーを見るようになる -

秘密鍵をロック解除するためのパスフレーズが必要です

ユーザー: "XYZ(デジタル署名付き)"

2048ビットRSAキー、ID AAAAAAAA、作成2016-07-01

エラー:gpgは致命的なデータの署名に失敗しました:コミットオブジェクトの書き込みに失敗しました

- 私はまだgit commit -a -m "message"を使って変更をコミットすることができます

同じことを克服する方法はありますか?それともgitのアップグレードに合わせてgpg設定に何らかの変更が必要ですか?


アップデート1

に従って、さらに有用性を追求するGitでGPGキーを使ってコミットを「自動署名」する方法はありますか。 。キーを使用してすでに設定しました

git config --global user.signingkey ED5CDE14(with my key) 
git config --global commit.gpgsign true

とにかく明らかに同じエラーになります。

180
Naman

私はOSXでこの問題に遭遇しました。

元の答え:

Gpgの更新(brew)がgpgの場所からgpg1に変更されたようです。gitがgpgを検索する場所のバイナリを変更できます。

git config --global gpg.program gpg1

あなたがgpg1を持っていないなら:brew install gpg1

更新された答え:

Gpg1は使用されなくなったようです/ "やさしく使われていない" したがって、おそらく実際にはgpg2にアップデートする必要があります。

brew upgrade gnupg  # This has a make step which takes a while
brew link --overwrite gnupg
brew install pinentry-mac
echo "pinentry-program /usr/local/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf
killall gpg-agent

最初の部分はgpg2をインストールし、後者は それを使うために必要なハック です。トラブルシューティングのために、 この答え を見てください(それはLinuxについてのものではありません)。それは良いテストを示唆しています:

echo "test" | gpg --clearsign  # on linux it's gpg2 but brew stays as gpg

このテストが成功した場合(エラー/出力にPGP署名が含まれていない場合)、最新のgpgバージョンに正常に更新されました。

これでgit signingを再び使えるようになるはずです。
注意が必要です。

git config --global gpg.program gpg  # perhaps you had this already? On linux maybe gpg2
git config --global commit.gpgsign true  # if you want to sign every commit

注:署名付きコミットを実行した後は、次のコマンドで署名されたことを確認できます。

git log --show-signature -1

これは最後のコミットのgpg情報を含みます。

290
Andy Hayden

Gnupg2とgpg-agent 2.xを使用している場合は、必ず環境変数GPG_TTYを設定してください。

export GPG_TTY=$(tty)

一般的な問題についてのGPGのドキュメントを参照してください

209
Koraktor

すべてが失敗した場合は、GIT_TRACE=1を使用して、gitが実際に何をしているのかを確認してください。

$ GIT_TRACE=1 git commit -m "Add page that always requires a logged-in user"
20:52:58.902766 git.c:328               trace: built-in: git 'commit' '-vvv' '-m' 'Add page that always requires a logged-in user'
20:52:58.918467 run-command.c:626       trace: run_command: 'gpg' '--status-fd=2' '-bsau' '23810377252EF4C2'
error: gpg failed to sign the data
fatal: failed to write commit object

失敗したコマンドを手動で実行します。

$ gpg -bsau 23810377252EF4C2
gpg: skipped "23810377252EF4C2": Unusable secret key
gpg: signing failed: Unusable secret key

結局のところ、私の鍵は期限切れになっていた、gitは非難することではなかった。

111
Bombe

私は DONE これを通して short そして easy recipe:

自動署名はMacOSでコミットします(グローバルにそして異なるIDEと)。

であなたのsigningkeyを入手してください

brew install gnupg gnupg2 pinentry-mac
git config --global user.signingkey <YOUR_SIGNING_KEY>
git config --global commit.gpgsign true
git config --global gpg.program gpg

以下をgpg.confファイルに入れます(nano ~/.gnupg/gpg.confコマンドでファイルを編集します)。

no-tty

以下をgpg-agent.confファイルに入れます(nano ~/.gnupg/gpg-agent.confコマンドでファイルを編集します)。

pinentry-program /usr/local/bin/pinentry-mac
40
Shayan Amani

古いデータで動かなくなるかもしれないプロセスgpg-agentを殺すのを助けるかもしれません。そのため、新しいgpg-agentがパスワードを要求します。

29
MaximKostrikin

ここに私の2セント:

キーを作成してgpg-agentに追加するとき、passphraseという名前を定義します。ある時点でpassphraseが期限切れになり、gpgを再度入力してキーのロックを解除し、再度署名を開始できるようにする必要があります。

gpgとインターフェイスする他のプログラムを使用する場合、gpgのパスフレーズの入力を求めるプロンプトはnot表示されます(基本的にgpg-agentデーモン化されている場合、stdin)に入力ダイアログを表示できない可能性があります。

解決策の1つはgpg --sign a_file.txtで、キーを作成したときに入力したパスフレーズを入力すると、すべてが正常になります(gpg-agentは自動的に署名する必要があります)

パスフレーズのタイムアウトをより長く設定し、常にこれを行う必要がないようにする方法については、 この回答 を参照してください。

または、ssh-keygen -pでパスフレーズを完全に削除できます

13

2016年10月更新: 問題871 「署名がGit 2.9.3で機能しなくなった」との記載があった

Git for Windows 2.10.1 2日前にリリースされた(2016年10月4日)は、Interactive GPGのコミットとタグの署名を修正しました。

最近のgitでのgpg-signの変更(これはLinuxでは問題ありません)は、WindowsではMSYS2-git以外がMSYS2-gpgとやり取りする方法で問題を露呈します。


元の答え:

" 7.4 Gitツール - あなたの仕事への署名 "を読んで、あなたはあなたの " user.signingkey "設定セットを持っていると思います。

Gpgに関する最後の大きなリファクタリング(Git 2.10以前)は commit 2f47eae2a にありました。ここで、エラーメッセージは gpg-interface.c に移動されました。

そのファイルのログは commit af2b21e の最近の変更を明らかにします。(Git 2.10)

gpg2はすでにデフォルトでロングフォーマットを使用していますが、ほとんどのディストリビューションでは互換性の理由から依然として "gpg"が古い1.xバージョンであるようです。そして古いバージョンのgpgは32ビットの短いIDしか表示しません。これは非常に安全ではありません。

これは実際には重要ではありません verification それ自体:検証に合格した場合、pgp署名は良好です。
しかし、実際にキーをまだ持っておらず、それを取得したい場合、またはどのキーが検証に使用されたかを正確に確認したい場合は、より正確にキーを指定する必要があります。

そのため、user.signingkeyの設定、および使用しているgpgのバージョン(gpg1またはgpg2)がどのように指定されているかを確認して、エラーメッセージに影響があるかどうかを確認してください。

commit 0581b54 もあります( commit 0d2b664 を補足するために)gpg failed to sign the dataエラーメッセージの条件を変更します:

私達は現在stderrから全く読んでいません。しかし、将来のパッチではそうしたいので、これもそこに私たちを準備します(そしてその場合gpg はすべての入力を読む前に 書き込みを行います。パイプバッファーを作成します。

コミット4322353 これでgpgは一時ファイルを使うようになったので、それに関する正しい問題があるかもしれません。

一時的な問題を処理するtempfileオブジェクトを使用するように変換し、不足しているクリーンアップ呼び出しを追加しましょう。

8
VonC

Cygwinを使って、私は最近gpg2に切り替えました。それから私はgit config gpg.program gpg2を設定した後にgitで署名するのと同じ問題を抱えていました。

Gpg2が機能しているかどうかを確認するためにecho "test" | gpg2 --clearsignを試してください。 git config gpg.program gpgを設定するのが最も簡単な解決策だと思いました。しかし、この方法でもより良いエラーが発生します。あなたが松果をインストールする必要があること。

7
lucidbrot

Gitのトレースは私の状況を非常に明らかにしていました...

   GIT_TRACE=1 git commit -m "a commit message"
   13:45:39.940081 git.c:344               trace: built-in: git commit -m 'a commit message'
   13:45:39.977999 run-command.c:640       trace: run_command: gpg --status-fd=2 -bsau 'full name <[email protected]>'
   error: gpg failed to sign the data
   fatal: failed to write commit object

gitがチェックしていたフォーマットに従って初期キーを生成する必要がありました。上記の-bsauに渡された値をそのままログにコピーし、以下で使用するのが最善です。

それで、

   gpg --quick-generate-key "full name <[email protected]>"

それからそれは働いた。

それが役立つことを願っています。

7
phyatt

MacOSマシンでこの問題に直面している人は、これを試してください。

  1. brew uninstall gpg
  2. brew install gpg2
  3. brew install pinentry-mac必要に応じて)
  4. gpg --full-generate-keyアルゴリズムを使用してキーを作成します。
  5. gpg --list-keysを実行して、生成されたキーを取得してください。
  6. ここにキーを設定してくださいgit config --global user.signingkey <Key from your list>
  7. git config --global gpg.program /usr/local/bin/gpg
  8. git config --global commit.gpgsign true
  9. あなたのキーをGitHubにエクスポートしたい場合は:gpg --armor --export <key>そしてGPGキーでこのキーをGitHubに追加してください: https://github.com/settings/keys (STARTとEND行を含みます)

問題がまだ存在する場合:

test -r ~/.bash_profile && echo 'export GPG_TTY=$(tty)' >> ~/.bash_profile

echo 'export GPG_TTY=$(tty)' >> ~/.profile

問題がまだ存在する場合:

インストール https://gpgtools.org そしてメニューバーからSignを押してあなたが使用したキーに署名します:Key - > Sign

問題がまだ存在する場合:

あなたのグローバルな.gitconfigファイル(私の場合は:/Users/gent/.gitconfigそして.gitconfigファイル_を修正してください(そしてEmailとNameが生成時に作成したものと同じであることを確認してください。キー)

[user]
        email = [email protected]
        name = Gent
        signingkey = <YOURKEY>
[gpg]
        program = /usr/local/bin/gpg
[commit]
        gpsign = true
        gpgsign = true
[filter "lfs"]
        process = git-lfs filter-process
        required = true
        clean = git-lfs clean -- %f
        smudge = git-lfs smudge -- %f
[credential]
        helper = osxkeychain
6
Gent Berani

私は同じ問題に遭遇しました。問題がgit 2.10.0ではなくgnupg 1.4.21にあることを報告できてうれしいです。

一時的にgnupgを1.4.20にダウングレードすると問題が解決しました。

自作を使用していて、私のようにパッケージをアップグレードした場合は、brew switch gnupg 1.4.20を実行して元に戻すことができます。

5
Arno

私はgpgが動作するかどうかをテストしようとした後にこれを得たので、どういうわけか私は誤ってgpgを更新したに違いありません:

gpg: WARNING: server 'gpg-agent' is older than us (2.1.21 < 2.2.10)
gpg: Note: Outdated servers may lack important security fixes.
gpg: Note: Use the command "gpgconf --kill all" to restart them.

gpgconf --kill allを実行することで私はそれを修正しました。

これが誰かに役立つことを願っています。

3
Visokoo

GPGキーのUIDに関連付けられたEメールがgitで使用しているEメールと異なる場合は、キーに別のユーザーIDを追加する必要がありますOR Eメールが完全に一致するキーを使用します。

以下を使用して別のUIDを追加できます。

$ gpg --edit-key

Mo https://superuser.com/questions/293184/one-gnupg-pgp-key-pair-two-emails を参照してください。

3
JavaRocky

私はすべての依存関係(Zlib、Bzip、cURL、PCRE、ReadLine、IDN2、iConv、Unistringなど)の最新のソースと共に構築された最新のGitソース(2.12.2)についても同様の問題を抱えていました。

libreadlineがGnuPGの問題を引き起こしていたことがわかります。

$ gpg --version
gpg: symbol lookup error: /usr/local/lib/libreadline.so.7: undefined symbol: UP

そしてもちろん、-vvvを使ってGitから有用な情報を得ようとしても失敗したので、失敗は謎でした。

ReadLineに起因するPGPの失敗を解決するには、 パッケージマネージャを更新または使用できない - gpg error の指示に従ってください。

ターミナルで:

ls /usr/local/lib

そこにはたくさんのreadlineライブラリ(libreadline.so.BLAH-BLAH)がありました。

su
mkdir temp
mv /usr/local/lib/libreadline* temp
ldconfig
2
jww

ぶら下がっているgpg-agentになるかもしれません。

ここで説明しているように、gpgconf --kill gpg-agentを試してください

2
Lounge9

上記の答えは素晴らしいですが、それらは私にとってうまくいきませんでした。私の問題を解決したのは、 public secret の両方のキーをエクスポートすることでした。

エクスポート元のマシンからのキーを一覧表示します。

$ gpg --list-keys
/home/user/.gnupg/pubring.gpg
--------------------------------
pub 1024D/ABCDFE01 2008-04-13
uid firstname lastname (description) <[email protected]>
sub 2048g/DEFABC01 2008-04-13

キーをエクスポートする

$ gpg --output mygpgkey_pub.gpg --armor --export ABCDFE01
$ gpg --output mygpgkey_sec.gpg --armor --export-secret-key ABCDFE01

インポート先のマシンに移動してインポートする

$ gpg --import ~/mygpgkey_pub.gpg
$ gpg --allow-secret-key-import --import ~/mygpgkey_sec.gpg

ビンゴボンゴ、完了です。

参照: https://www.debuntu.org/how-to-importexport-gpg-key-pair/

ps。私の鍵はもともとブートキャンプの窓7で作られたもので、私はそれらを私のMacにエクスポートしました(同じ物理マシン、事実上異なる)

2
asus

あなたの電子メールが正しく設定されていることを確認してください。

git config --global user.email "[email protected]"
2
Weston Reed

以下のURLに従って署名付きコミットを設定してください https://help.github.com/en/articles/telling-git-about-your-signing-key

それでもgpgを取得しても致命的なデータに署名できなかった場合:コミットオブジェクトを書き込めなかった

これはgitでは問題ありません、これはGPGで以下の手順に従ってください

1 .gpg --version

  1. echo "test" | gpg --clearsign

表示されている場合:

gpg: signing failed: Inappropriate ioctl for device
gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device
  1. それからexport GPG_TTY=$(tty)を使います

4.PGP署名が得られたecho "test" | gpg --clearsignをもう一度試してください。

  1. git config -l | grep gpg

gpg.program = gpg commit.gpgsign = true

6. git commit -S -m "commitMsz"を適用する

2
jayesh

上記の答えのどれも私の問題に合っていないようでした。私のgpgname__バイナリ(/usr/local/bin/gpg -> /usr/local/MacGPG2/bin/gpg2)は、brewではなく GPG Suite の一部としてインストールされました。

それにもかかわらず、私はその助言が次のようにまとめられたと感じました:「どちらのgpgname__バイナリがbrewで入手可能な最新のバイナリを使用する」。だから私は試してみました:

brew update
brew upgrade git
brew install gpg

# the following are suggestions from brew's Caveats, to make `/usr/local/bin/gpg`
# point to the brew binary:
rm '/usr/local/bin/gpg'
brew link --overwrite gnupg2

$PATHgpgname__をbrewの新しい実行可能ファイルを指すように正しく変更したことを確認しました。

???? which gpg
/usr/local/bin/gpg
???? ls -l /usr/local/bin/gpg
lrwxr-xr-x  1 burger  admin  33 Feb 13 13:22 /usr/local/bin/gpg -> ../Cellar/gnupg2/2.0.30_3/bin/gpg

そして私はgitにどのgpgname__バイナリを使うべきかを明示的に伝えました:

git config --global gpg.program gpg

まあ、それは道に敏感なので、それは完全に水密ではないかもしれません。私は実際にgitがgpgname__を醸造することに切り替えたことを疑う余地なく確認することには至りませんでした。

いずれにせよ:git commitが再び私のコミットに署名するのに十分なものではありませんでした。


私にとって最終的にうまくいったことは GPG Suiteを更新することです 。バージョン2016.7を実行していましたが、2016.10にアップデートすると問題が解決することがわかりました。

GPG Keychain.appを開き、「Check for updates…」をクリックしました。新しいバージョンでは、署名されたコミットが再び正しく機能しました。

1
Birchlabs

私はUbuntu 18.04を使用していて同じエラーを受け取り、何週間も心配していました。最後に、gpg2は何も指していないことに気づきました。だから単に実行する

git config --global gpg.program gpg

そして多田さん、それは魅力のように働きます。

Signed commit 

あなたのコミットはこれでそれらとのタグを確認しました。

1
Aashutosh Rathi

@birchlabsと非常によく似ていますが、たくさんの掘り下げて検索した結果、GPGではなくGPG Suiteであることがわかりました。私はcask reinstall gpg-suiteをしました、そしてそれは私のためにそれを解決しました。

1
John

それは単にそれによってセットアップを得ました:

brew uninstall gpg 

brew install gpg2
1
Anurag pareek

ちょっと変なものですが、端末が十分に大きいことを確認してください! echo test | gpg --clearsignを実行すると、サイズが小さすぎるかどうかを確認できます。これにより、わかりやすいエラーメッセージが表示されます。十分に大きくない場合、GPGエージェントはその小さなncursesボックスを表示できません。

GUIエージェントまたはncursesを使用しない何かを使用する場合、これは適用されません。

0
Nic Hartley

私はかなりの数の提案を試みたが運が悪い、そしてこれで終わった。私はこれが完璧ではないことを知っています、しかし私はできるだけ早く私の仕事に戻りたいです。

git config commit.gpgsign false
0
jacksun101

私の場合、他の回答で述べられている解決策はどれもうまくいきませんでした。私は問題が一つのリポジトリに固有のものであることを知りました。リポジトリを削除してクローンを作成すると、この問題は解決しました。

0
David Miguel

私の場合のように、これがランダムに起こって過去に完全に働いていたならば、ログアウト(cmd+shift+q)してログインし直してみてください。

0
Skylar Brown

構成の問題ではなく、キーの有効期限が切れたため、このエラーに出くわしました。 OSXでその有効性を拡張する最も簡単な方法は、GPGキーチェーンアプリ(インストールされている場合)を開くことです。自動的に拡張を促すメッセージが表示されます。 2回クリックするだけで完了です。うまくいけば、これが仲間のGoogle社員に役立つ:)

0
maxhm10

私は同様の答えを見てきましたが、私のために働いたものとまったく同じものはありません。 Linuxでは、gpg-agentを強制終了して再起動する必要がありました。

$ pkill gpg-agent
$ gpg-agent --daemon
$ git commit ...

これは私のためにトリックをしました。 user.signingkeyをプライベートキーに設定する必要があるようです。他のコメントからも同様です。

0
Engineero