gpg ล้มเหลวในการลงชื่อข้อมูลที่ร้ายแรง: ไม่สามารถเขียนการมอบหมายวัตถุ [Git 2.10.0]


319

ฉันได้ติดตามบทความบางอย่างเกี่ยวกับคุณลักษณะที่น่าสนใจในบันทึกย่อประจำรุ่นGit 2.10 จะผ่านซึ่งอัพเกรดคอมไพล์เป็น 2.10.0 และทำการเปลี่ยนแปลงระดับโลก.gitconfigผลดังนี้ -

[filter "lfs"]
    clean = git-lfs clean %f
    smudge = git-lfs smudge %f
    required = true
[user]
    name = xyz
    email = abc.def@gmail.com
    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 (เซ็นชื่อแบบดิจิทัล)"

คีย์ RSA 2048 บิต, ID AAAAAAAA, สร้าง 2016-07-01

ข้อผิดพลาด: gpg ล้มเหลวในการลงนามข้อมูลที่ร้ายแรง: ล้มเหลวในการเขียนวัตถุยอมรับ

หมายเหตุ - ฉันยังคงสามารถยอมรับการเปลี่ยนแปลงโดยใช้git commit -a -m "message"

มีวิธีเอาชนะแบบเดียวกันหรือไม่? หรือการเปลี่ยนแปลงใด ๆ ที่จำเป็นในการปรับแต่งgpgเพื่อให้สอดคล้องกับการอัพเกรด git หรือไม่?


อัปเดต 1

การหาประโยชน์เพิ่มเติมต่อไปนี้มีวิธีการ "ลงชื่อเข้าใช้อัตโนมัติ" ใน Git ด้วยคีย์ GPG หรือไม่? . ฉันกำหนดค่าคีย์แล้วโดยใช้

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

และค่อนข้างชัดเจนว่าได้รับข้อผิดพลาดเดียวกันอยู่แล้ว


3
ฉันประสบปัญหาคล้ายกัน ฉันถอนการติดตั้ง Git 2.8 (git-scm) บน Windows และติดตั้ง 2.10 ตอนนี้ผมได้รับการใช้งานทุกครั้งที่ฉันgpg failed to sign the data -Sใน 2.8 ฉันสามารถลงนามใน commit ได้โดยไม่มีปัญหา ฉันไม่รู้ว่าเกิดอะไรขึ้น
แสงสว่างใน

5
การเพิ่มuser.signingkeyแก้ไขปัญหาของฉันแปลกพอ
Xavier Ho

1
@nullpointer ฉันได้ลบคำตอบจากที่นั่นเพราะหลังจากมองลึกฉันรู้ว่ามันซ้ำกัน!
Shayan Amani

1
ประชดฉันจะเปลี่ยนเครื่องของฉันเพื่อตั้งค่าสิ่งใหม่อีกครั้งและจบลงด้วยการมองหาคำถามของตัวเองและไม่มีวิธีแก้ปัญหาที่แนะนำดูสะอาดพอสำหรับฉันที่เพิ่งเริ่มต้น
Naman

1
สำหรับฉันแก้ไขคือ: git config user.namewas! = ชื่อที่ใช้เมื่อสร้างคีย์ PGP
stacksonstacks

คำตอบ:


463

ฉันพบปัญหากับ OSX

คำตอบเดิม:

ดูเหมือนว่าการอัปเดต gpg (จากการชง) เปลี่ยนเป็นตำแหน่งของgpgเป็นgpg1คุณสามารถเปลี่ยนไบนารีที่ git ค้นหา gpg:

git config --global gpg.program gpg1

หากคุณไม่ได้มี brew install gpg1gpg1:

คำตอบที่อัปเดต:

ดูเหมือนว่า 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 และรุ่นหลังต้องใช้แฮ็ค สำหรับการแก้ไขปัญหาให้ดูคำตอบนี้ (แม้ว่าจะเป็นเรื่องเกี่ยวกับลินุกซ์ที่ไม่ได้ชง) ก็แนะนำให้ทดสอบที่ดี:

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

หากการทดสอบนี้สำเร็จ (ไม่มีข้อผิดพลาด / เอาต์พุตรวมถึงลายเซ็น PGP) แสดงว่าคุณได้อัปเดตเป็นเวอร์ชัน gpg ล่าสุดแล้ว

ตอนนี้คุณควรจะสามารถใช้การเซ็นต์คอมไพล์ได้อีกครั้ง!
มันคุ้มค่าที่จะต้องทราบ:

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 สำหรับการส่งครั้งล่าสุด


7
การตั้งค่า gpg.program เป็น / usr / local / bin / gpg (ไม่ "1") แก้ไขให้ฉัน
Iskar

5
ดูเหมือนว่าการปรับปรุงgnupg2กับbrewสับสนกับ symlinks จึงจะถูกลบออกผมก็มีการเชื่อมโยงการแก้ไขโดยใช้gpg brew link --overwrite gnupg2
Brice

8
หืม ... ไม่ทำงาน ยังคงให้ข้อผิดพลาดของฉันกับการลงชื่อเข้าใช้ xcode
อัลเบิร์ตต. วงศ์

1
@DrBeco นั้นไม่ใช่ตำแหน่ง / พฤติกรรมดั้งเดิมใช่ไหม ฉันยังคงมีปัญหาเดียวกันบน osx (ฉันคิดว่าฉันได้ปรับปรุงการชงของฉันค่อนข้างเร็ว) gpg1เป็นปฏิบัติการส่งออกยังคง
Andy Hayden

29
killall gpg-agent && gpg-agent --daemon --use-standard-socket --pinentry-program /usr/local/bin/pinentryในที่สุดก็แก้ไขให้ฉัน
Dan Bechard

317

หาก gnupg2 และ 2.x gpg GPG_TTYตัวแทนจะใช้ให้แน่ใจว่าได้ตั้งค่าตัวแปรสภาพแวดล้อม

export GPG_TTY=$(tty)

ดูเอกสาร GPG เกี่ยวกับปัญหาที่พบบ่อย


17
หากใช้ปลาให้ใส่set -x GPG_TTY (tty)โปรไฟล์ของคุณ
fasfsfgs

@StuartCardall จุดประสงค์ของคำสั่ง chown คืออะไร? โดยทั่วไปแล้วจะได้รับการกำหนดให้กับคุณโดยกระบวนการของระบบเมื่อคุณเข้าสู่ระบบหรือสร้าง pseudo-tty ถ้ามันเป็นของคนอื่นและคุณไม่รูทมันจะล้มเหลว หากกลุ่มเป็นอย่างอื่นอาจไม่สำคัญและโดยทั่วไปผู้ใช้จะไม่อยู่ในกลุ่ม tty
poolie

@poolie - มันสำคัญถ้าคุณsuไปrootที่เซิร์ฟเวอร์ระยะไกล
Stuart Cardall

6
ฉันเพิ่มตัวแปรไป~/.zshrcแล้วและฉันสามารถคอมมิทอีกครั้งตอนนี้มันเชื่อมต่อกับเทอร์มินัลอย่างถูกต้อง ขอบคุณสำหรับความช่วยเหลือของคุณ!
Alex Gurrola

นี่เป็นคำแนะนำใน GitHub: help.github.com/articles/telling-git-about-your-gpg-key
bonh

198

หากทุกอย่างล้มเหลวใช้GIT_TRACE=1เพื่อลองและดูว่าคอมไพล์กำลังทำอะไรอยู่:

$ 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จะไม่ตำหนิ


34
เคล็ดลับที่ดีสำหรับการแก้จุดบกพร่อง +1
VonC

4
สิ่งนี้ช่วยฉันในการแก้ปัญหาของตัวเองได้จริงและเป็นวิธีการแก้ปัญหาทุกประเภทด้วยข้อความสถานะนี้ +1
xHocquet

ขอบคุณสำหรับการแก้จุดบกพร่องเดินผ่าน รหัสของฉันหมดอายุเช่นกัน
Sgnl

2
ขอบคุณ! นี่ทำให้ฉันมีปัญหา พอท้องถิ่นของฉัน.git/configมีnameโครงการหนึ่งที่ระบุว่าไม่ตรงกับอีเมลลงนามของฉัน นั่นก็เพียงพอแล้วที่จะปฏิเสธมัน
kross

1
การรันgpg -bsau <key>บนเครื่องของฉันก็ไม่ได้ทำอะไรเลย สิ่งนี้คาดว่าจะใช้เวลานานเกินไปในการดำเนินการหรือไม่ หรือหมายความว่ากุญแจนี้ใช้ได้ดี? @VonC มีข้อมูลเชิงลึกใด ๆ
Naman

82

ผมเคยทำมันผ่านนี้สั้นและง่ายสูตร:

ลงชื่อเข้าใช้อัตโนมัติบน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

อัปเดต :

คุณอาจต้องดำเนินการkillall gpg-agentคำสั่งหลังจากแก้ไขไฟล์กำหนดค่าgpg.confตามความคิดเห็น ตามที่คำสั่งอธิบายตนเองคำสั่งนี้จะยุติเอเจนต์ GPG (Gnu Privacy Guard)


2
คุณสามารถอธิบายว่าคำสั่งเหล่านั้นกำลังทำอะไรได้บ้าง? มันจะช่วยด้วยความเข้าใจ
Droid

7
ฉันยังต้องเรียกใช้killall gpg-agentหลังจากตั้งค่าไฟล์แล้วมันก็ใช้งานได้!
Pascal Ludwig

เรารู้ได้อย่างไรว่าเราสามารถไว้วางใจผู้คนที่อยู่เบื้องหลังได้pinentry-mac? ผมไม่ได้บอกว่าเราไม่สามารถ แต่ GPGTools องค์กรของการสำรองข้อมูลโดยทีมงานที่มีขนาดเล็กมากและ repo มีเพียง 5 ร่วมสมทบเทียบกับการใช้brew install gnupgที่ยกระดับการทำงานของgnupg.org
sunknudsen

ในกรณีที่ช่วยคนอื่น ๆ ปัญหาของฉันคือฉันมีuser.signingkeyชุดท้องถิ่นที่ไม่ถูกต้องซึ่งฉันไม่ได้สังเกตเห็นในการกำหนดค่าต้นกำเนิดของฉันหรือการตั้งค่าทั่วโลกของฉัน (เพราะฉันไม่คิดว่าจะดูการกำหนดค่าท้องถิ่นgit config --local --get user.signingkey) และระดับโลก ( git config --global --get user.signingkey) จะเหมือนกันหรือดียิ่งขึ้น, ตั้งค่าท้องถิ่นหนึ่งถ้ามันไม่ถูกต้อง ( git config --local --unset user.signingkey)
เกล็น 'devalias'

บน OSX (10.13.06) มันให้ข้อผิดพลาดดังต่อไปนี้ทุบตี: โปรแกรม pinentry: ไม่พบคำสั่ง
cgl

59

อาจช่วยฆ่ากระบวนการgpg-agentที่อาจติดอยู่กับข้อมูลเก่า ดังนั้นการgpg-agentเริ่มต้นใหม่จะขอรหัสผ่าน


2
มันทำเพื่อฉัน
danyim

12
ใช้gpg-agent --daemonเพื่อเริ่ม
FooBar

1
ฉันต้องรีสตาร์ท gpg-agent ด้วย
GnrlBzik

8
เพื่อฆ่ากระบวนการบน macOS:killall gpg-agent
incleaf

1
ในอูบุนตูgpgconf --kill gpg-agent
อดัม

37

ทำตาม URL ด้านล่างเพื่อตั้งค่าการลงนามยอมรับ https://help.github.com/th/articles/telling-git-about-your-signing-key

หากยังคงได้รับ gpg ล้มเหลวในการลงนามข้อมูลร้ายแรง: ล้มเหลวในการเขียนวัตถุยอมรับ

นี่ไม่ใช่ปัญหากับ git นี่คือกับ GPG ทำตามขั้นตอนด้านล่าง

1gpg --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. ลองอีกครั้งecho "test" | gpg --clearsign ซึ่งได้รับลายเซ็น PGP

  1. git config -l | grep gpg

gpg.program = gpg commit.gpgsign = true

6.apply git commit -S -m "commitMsz"


1
นี่คือทางออกสำหรับฉัน! ขอบคุณมาก!
upInCloud

วิธีการที่ยอดเยี่ยมในการพิจารณาว่าเป็นปัญหาหรือไม่
Philippe Signoret

นี่คือสิ่งที่ทำเพื่อฉัน ขอบคุณมาก!
อัลลัน Guwatudde

export GPG_TTY=$(tty)คือเคล็ดลับ เพิ่มที่.zshrcไฟล์ของฉัน
Shane Stillwell

22

สำหรับใครก็ตามที่ประสบปัญหานี้ในเครื่อง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> และเพิ่มคีย์นี้ไปยัง GitHub ที่ปุ่ม GPG: https://github.com/settings/keys (รวมบรรทัดเริ่มต้นและสิ้นสุด)

หากปัญหายังคงมีอยู่:

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ไฟล์(โปรดตรวจสอบอีเมล์และชื่อจะเหมือนกันกับคนที่คุณได้สร้างขึ้นในขณะที่การสร้างกุญแจ) :

[user]
	email = gent@youremail.com
	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


2
การเพิ่ม 'gpsign = true' ใน. gitconfig แก้ไขให้ฉัน
Pierre

18

สองเซ็นต์ของฉันที่นี่:

เมื่อคุณสร้างและเพิ่มปุ่มเพื่อ gpg passphraseตัวแทนคุณกำหนดสิ่งที่เรียกว่า ตอนนี้passphraseในบางจุดหมดอายุและgpgต้องการให้คุณป้อนอีกครั้งเพื่อปลดล็อคกุญแจของคุณเพื่อให้คุณสามารถเริ่มการลงชื่ออีกครั้ง

เมื่อคุณใช้โปรแกรมอื่น ๆ ที่เชื่อมต่อกับgpg, gpg's พร้อมที่จะให้คุณใส่รหัสผ่านไม่ได้ปรากฏ (พื้นgpg-agentเมื่อ daemonized ไม่อาจแสดงให้คุณโต้ตอบการป้อนข้อมูลในstdin)

หนึ่งในวิธีแก้ไขคือgpg --sign a_file.txtป้อนวลีรหัสผ่านที่คุณป้อนเมื่อคุณสร้างคีย์และทุกอย่างควรจะดี ( gpg-agentควรลงชื่อโดยอัตโนมัติ)

ดูคำตอบนี้เกี่ยวกับวิธีตั้งค่าการหมดเวลาที่นานขึ้นสำหรับข้อความรหัสผ่านของคุณเพื่อที่คุณจะได้ไม่ต้องทำเช่นนี้ตลอดเวลา

หรือคุณสามารถลบข้อความรหัสผ่านได้อย่างสมบูรณ์ ssh-keygen -p

แก้ไข: ทำman gpg-agentเพื่ออ่านบางสิ่งบางอย่างเกี่ยวกับวิธีการที่จะเกิดขึ้นข้างต้นโดยอัตโนมัติและเพิ่มบรรทัด:

GPG_TTY=$(tty)
export GPG_TTY

ใน. bashrc ของคุณหากคุณกำลังใช้ bash (นี่คือคำตอบที่ถูกต้อง แต่ฉันกำลังฝึกความคิดของฉันไว้ด้านบนด้วย)


ขอบคุณ @ george-daramouskas นี่คือปัญหาของฉัน
Nic Barker

10

อัปเดตตุลาคม 2559: ปัญหา 871พูดถึง "การเซ็นหยุดทำงานใน Git 2.9.3"

Git สำหรับ Windows 2.10.1เปิดตัวสองวันที่ผ่านมา (4 ต.ค. 2559) ได้แก้ไขการเซ็นสัญญาและแท็กแบบโต้ตอบของ GPG

การเปลี่ยน gpg-sign ล่าสุดใน git (ซึ่งไม่มีปัญหาบน Linux) ทำให้เกิดปัญหาในแบบที่ Windows ไม่โต้ตอบกับ MSYS2-git สำหรับ MSYS2-git


คำตอบเดิม:

การอ่านเครื่องมือ 7.4 Git - การลงนามในงานของคุณฉันคิดว่าคุณมีuser.signingkeyชุดการกำหนดค่าของคุณ

การปรับโครงสร้างครั้งใหญ่ครั้งก่อน (ก่อน Git 2.10) รอบ gpg กระทำ 2f47eae2aที่นี่ข้อความผิดพลาดถูกย้ายไปที่gpg-interface.c

บันทึกในไฟล์นั้นแสดงให้เห็นถึงการเปลี่ยนแปลงล่าสุดในการกระทำ af2b21e (Git 2.10)

gpg2 ใช้รูปแบบที่มีความยาวเป็นค่าเริ่มต้นแล้ว แต่การแจกแจงส่วนใหญ่ดูเหมือนจะยังมี "gpg" เป็นเวอร์ชั่น 1.x ที่เก่ากว่าเนื่องจากเหตุผลด้านความเข้ากันได้ และ gpg รุ่นเก่าจะแสดง ID แบบสั้น 32 บิตเท่านั้นซึ่งค่อนข้างไม่ปลอดภัย

สิ่งนี้ไม่สำคัญสำหรับการยืนยันตัวเอง: หากการตรวจสอบผ่านไปแล้วลายเซ็น pgp นั้นดี
แต่ถ้าคุณยังไม่มีรหัสจริงและต้องการดึงข้อมูลหรือต้องการตรวจสอบว่าใช้คีย์ใดในการตรวจสอบและต้องการตรวจสอบเราควรระบุคีย์ด้วยความแม่นยำมากขึ้น

ดังนั้นตรวจสอบว่าคุณระบุuser.signingkeyการกำหนดค่าของคุณอย่างไรและรุ่นของ gpg ที่คุณใช้อยู่ (gpg1 หรือ gpg2) เพื่อดูว่าสิ่งเหล่านั้นมีผลกระทบต่อข้อความแสดงข้อผิดพลาดหรือไม่

นอกจากนี้ยังมีการยอมรับ 0581b54ซึ่งเปลี่ยนเงื่อนไขสำหรับgpg failed to sign the dataข้อความแสดงข้อผิดพลาด (เพื่อเสริมการยอมรับ 0d2b664 ):

เราไม่ได้อ่านจาก stderr เลยในขณะนี้ อย่างไรก็ตามเราจะต้องการในแพทช์ในอนาคตดังนั้นสิ่งนี้ก็เตรียมเราไว้ด้วย (และในกรณีนั้น gpg จะเขียนก่อนอ่านอินพุตทั้งหมด แต่อีกครั้งมันไม่น่าเป็นไปได้ที่คีย์ uid จะเติมบัฟเฟอร์ของท่อ)

Commit 4322353แสดง gpg ตอนนี้ใช้ไฟล์ชั่วคราวดังนั้นอาจมีปัญหาที่ถูกต้อง

ลองเปลี่ยนเป็นการใช้วัตถุ tempfile ซึ่งจัดการกรณียาก ๆ ของเราและเพิ่มการเรียกล้างข้อมูลที่ขาดหายไป


ฉันมีuser.signingkeyชุดปรับแต่งแล้ว gpg (GnuPG) 2.0.3ยังมีการใช้
Naman

@nullpointer ฉันได้แก้ไขคำตอบของฉันแล้ว คุณช่วยตรวจสอบว่าปัญหายังคงอยู่กับ Gti สำหรับ Windows 2.10.1 หรือไม่
VonC

ขออภัยที่มีการอัปเดตล่าช้าซึ่งทำงานบน MacOSX ไม่ใช่ Windows ดังนั้นจึงไม่สามารถยืนยันได้
Naman

10

ร่องรอยของคอมไพล์นั้นเปิดเผยมากสำหรับสถานการณ์ของฉัน ...

   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 <your-email@domain.com>'
   error: gpg failed to sign the data
   fatal: failed to write commit object

ฉันต้องการสร้างคีย์เริ่มต้นตามรูปแบบที่gitตรวจสอบ เป็นการดีที่สุดที่จะคัดลอกค่าที่ส่งไป-bsauด้านบนในบันทึกตามที่เป็นและใช้ด้านล่าง

ดังนั้นมันจึงกลายเป็น

   gpg --quick-generate-key "full name <your-email@domain.com>"

จากนั้นก็ใช้งานได้

หวังว่าจะช่วย


สิ่งนี้ใช้ได้สำหรับฉันและgit traceเป็นประโยชน์จริงๆ
philip oghenerobo balogun

1
เพื่อน ... คุณไม่สามารถนึกภาพว่าฉันใช้เวลาพยายามเรียงลำดับจนกว่าฉันจะได้คำตอบของคุณ ... มันคือการตั้งชื่อของคีย์ตลอด .. ขอบคุณ! ขอบคุณ! ขอบคุณ!
giomanda

8

ใช้ Cygwin gpg2ฉันเพิ่งเปลี่ยนไป git config gpg.program gpg2จากนั้นผมก็มีปัญหาเดียวกันสำหรับการเซ็นสัญญากับคอมไพล์หลังจากที่การตั้งค่า

ลองecho "test" | gpg2 --clearsignดูว่า gpg2 ทำงานหรือไม่ ฉันพบว่าเป็นวิธีที่ง่ายที่สุดในการตั้งค่าgit config gpg.program gpgเพราะใช้งานได้ แต่คุณจะได้รับข้อผิดพลาดที่ดีกว่าด้วยวิธีนี้เช่นคุณต้องติดตั้ง pinentry


ที่จริงแล้วใน Linux distros บางตัวคุณอาจพบเจอปัญหาเดียวกัน Git ใช้ gpg เสมอไม่ใช่ gpg2 ดูเพิ่มเติมที่: stackoverflow.com/questions/34766123/…
rugk

นี้เปิดเผยสำหรับฉันข้อผิดพลาดที่สามารถแก้ไขได้โดยgpg: signing failed: Inappropriate ioctl for device export GPG_TTY=$(tty)ที่มา: github.com/keybase/keybase-issues/issues/2798
swiknaba

8

ใน OS X การใช้gnupg2ชงผ่านฉันต้องฆ่าตัวแทน gpgบางครั้งเกิดขึ้น:

pkill -9 gpg-agent

และตั้งค่าenvตัวแปรหากจำเป็น:

export GPG_TTY=$(tty)

ดูปัญหา GPG ทั่วไปและคำตอบนี้ได้ที่นี่เช่นกัน


2
สิ่งนี้ใช้ได้สำหรับฉันเช่นกัน ฉันสร้างนามแฝงใหม่alias fix-gpg='pkill -9 gpg-agent && export GPG_TTY=$(tty)'แล้ว
oalders

1
มันใช้งานได้ดีขอบคุณ ไม่จำเป็นต้องตั้งค่าตัวแปร env ด้วยซ้ำ
Nick Rameau

7

ฉันเห็นคำตอบที่คล้ายกัน แต่ไม่มีอะไรเหมือนสิ่งที่ฉันชอบ บน Linux ฉันต้องฆ่าและรีสตาร์ทgpg-agentด้วย:

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

นี้ได้เคล็ดลับสำหรับฉัน. ดูเหมือนว่าคุณจำเป็นต้องuser.signingkeyตั้งค่าให้คีย์ส่วนตัวของคุณเช่นกันจากความคิดเห็นอื่น ๆ

$ git config --global user.signingkey [your_key_hash]


6

ผมได้รับข้อผิดพลาดนี้บน Ubuntu 18.04 และมันกลับกลายเป็นว่าฉันสำคัญหมดอายุ

เพื่อดูสิ่งนี้ฉันวิ่งและยืนยันว่ากุญแจของฉันหมดอายุ:

gpg --list-keys

เพื่อแก้ไขสิ่งนี้ฉันวิ่ง (ใช้ ID ที่แสดงในคำสั่งก่อนหน้า):

gpg --edit-key <ID>

จากนั้นฉันขยายการหมดอายุของkey 0และkey 1ทำตามคำแนะนำเหล่านี้ซึ่งต้มลงไปพิมพ์key 0แล้วexpireทำตามคำแนะนำ key 1จากนั้นทำซ้ำสำหรับ

หลังจากนั้นเพื่อทดสอบสิ่งนี้ฉันวิ่ง:

echo test | gpg --clearsign

และก่อนการแก้ไขมันล้มเหลวด้วยข้อผิดพลาด:

gpg: ไม่มีรหัสลับเริ่มต้น: ไม่มีรหัสลับ
gpg: [stdin]: การลงชื่อเข้าใช้ล้มเหลว: ไม่มีรหัสลับ

แต่หลังจากการแก้ไขคำสั่งเดียวกันก็สามารถเซ็นข้อความได้สำเร็จดังนั้นฉันจึงรู้ว่าสิ่งต่าง ๆ กำลังทำงานอีกครั้ง!


การยืนยันนี้แก้ไขปัญหาเมื่อนำเข้าคีย์ที่ถูกต้องจาก Mac OSX Catalina ไปยัง CentOS7 ต่อสู้กับสัตว์ร้ายตัวนี้นานกว่าสองชั่วโมงพยายามคิดว่าทำไมมันถึงขอรหัสผ่านท่ามกลางสิ่งอื่น ๆ ผิดปกติพอมันถูกกำหนดให้ไม่มีวันหมดอายุและฉันตั้งให้มันยังไม่หมดอายุ
โคดี้ B

5

ฉันพบปัญหาเดียวกัน ฉันยินดีที่จะรายงานว่าปัญหานี้ไม่ได้เกิดขึ้นgit 2.10.0กับที่เกิดขึ้นgnupg 1.4.21ขึ้น

การลดระดับ gnupg ชั่วคราวเป็น 1.4.20 ได้แก้ไขปัญหาสำหรับฉันแล้ว

หากคุณใช้ homebrew และคุณอัพเกรดแพ็คเกจเหมือนที่เคยทำคุณอาจจะสามารถbrew switch gnupg 1.4.20ย้อนกลับไปใช้


3

ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าอีเมลของคุณอย่างถูกต้อง

git config --global user.email "user@example.com"

1
นี้เป็นเพียงการแก้ปัญหาที่ทำงานสำหรับฉันเป็นประโยชน์ต่อการปฏิบัติตามวิธีการที่ถูกต้องในการสร้างคีย์ GPG ผ่านGitHub
Naz

1
ในกรณีของฉันปัญหาคือว่าฉันใช้อีเมล บริษัท ใน repo เฉพาะซึ่งฉันไม่ได้สร้างคีย์ PGP
rubick

3

หากอีเมลที่ตรงกับรหัส GPG ของคุณแตกต่างจากอีเมลที่คุณใช้เป็น git คุณจะต้องเพิ่มรหัสผู้ใช้อื่นในรหัสของคุณหรือใช้รหัสที่ตรงกับอีเมลทั้งหมด

คุณสามารถเพิ่ม UID อื่นได้โดยใช้:

$ gpg - ปุ่มแก้ไข

ดูโมสำหรับ/superuser/293184/one-gnupg-pgp-key-pair-two-emails


1
นี่มันสำหรับฉัน คริสต์วิธีไม่มีข้อผิดพลาดให้ข้อมูลมากกว่า "ไม่สามารถลงชื่อข้อมูล"
Alec

3

ฉันต้องอัปเดต 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ซ่อมมันให้ฉัน

หวังว่านี่จะช่วยใครซักคน


2

ฉันมีปัญหาที่คล้ายกันกับแหล่ง Git ล่าสุด (2.12.2) ที่สร้างขึ้นพร้อมกับแหล่งที่มาล่าสุดของการอ้างอิงทั้งหมด (Zlib, Bzip, cURL, PCRE, ReadLine, IDN2, iConv, Unistring ฯลฯ )

ปรากฏว่าlibreadlineมีปัญหา GnuPG:

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

และแน่นอนว่าการพยายามรับข้อมูลที่เป็นประโยชน์จาก Git เมื่อ-vvvล้มเหลวดังนั้นความล้มเหลวจึงเป็นเรื่องลึกลับ

ในการแก้ไขความล้มเหลวของ PGP เนื่องจาก ReadLine ให้ทำตามคำแนะนำที่ไม่สามารถอัปเดตหรือใช้ตัวจัดการแพ็กเกจ - ข้อผิดพลาด gpg :

ในอาคารผู้โดยสาร:

ls /usr/local/lib

มีกลุ่มของ readline libs อยู่ในนั้น (libreadline.so.BLAH-BLAH) ดังนั้นฉัน:

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

2

คำตอบข้างต้นนั้นยอดเยี่ยม แต่ก็ไม่ได้ผลสำหรับฉัน สิ่งที่แก้ไขปัญหาของฉันคือการส่งออกกุญแจสาธารณะและคีย์ลับ

รายการคีย์จากเครื่องที่เราส่งออกจาก

$ gpg --list-keys
/home/user/.gnupg/pubring.gpg
--------------------------------
pub 1024D/ABCDFE01 2008-04-13
uid firstname lastname (description) <email@example.com>
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

bingo bongo คุณทำเสร็จแล้ว!

การอ้างอิง: https://www.debuntu.org/how-to-importexport-gpg-key-pair/

PS ปุ่มของฉันถูกสร้างขึ้นครั้งแรกใน bootcamp windows 7 และฉันส่งออกไปยังเครื่อง mac ของฉัน (เครื่องทางกายภาพที่แตกต่างกันจริง)


2

ฉันอยู่ใน Ubuntu 18.04 และได้รับข้อผิดพลาดเดียวกันก็เป็นห่วงหลายสัปดาห์เช่นกัน ในที่สุดก็รู้ว่า gpg2 ไม่ได้ชี้ไปที่อะไร ดังนั้นเพียงแค่เรียกใช้

git config --global gpg.program gpg

และธาดาก็ทำงานเหมือนมีเสน่ห์

เซ็นสัญญาแล้ว

การกระทำของคุณจะมีแท็กที่ยืนยันแล้ว


2

ฉันสะดุดกับข้อผิดพลาดนี้ไม่ใช่เพราะปัญหาการกำหนดค่าใด ๆ แต่เนื่องจากรหัสของฉันหมดอายุ วิธีที่ง่ายที่สุดในการยืดอายุการใช้งานบน OSX คือการเปิดแอป GPG Keychain (หากคุณติดตั้งไว้) และจะแจ้งให้คุณขยายโดยอัตโนมัติ สองคลิกเสร็จแล้ว หวังว่านี่จะช่วยเพื่อนชาว Google :)


2

สิ่งนี้เริ่มเกิดขึ้นโดยฉับพลันสำหรับฉันบน Ubuntu ไม่แน่ใจว่ามีการอัปเดตล่าสุดบางอย่างเกิดขึ้น แต่ไม่มีปัญหาที่มีอยู่สำหรับฉัน (ฉันได้GPG_TTYตั้งลองฆ่าเอเจนต์ ฯลฯ ) gpgคำสั่งแบบสแตนด์อโลนล้มเหลวโดยมีข้อผิดพลาดนี้:

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

test
gpg: signing failed: Operation cancelled
gpg: [stdin]: clear-sign failed: Operation cancelled

ฉันลองใช้งานgpgด้วย--debug-allตัวเลือกและสังเกตผลลัพธ์ด้านล่าง:

gpg: DBG: chan_3 <- INQUIRE PINENTRY_LAUNCHED 27472 gnome3 1.1.0 /dev/pts/6 screen-256color -
gpg: DBG: chan_3 -> END
gpg: DBG: chan_3 <- ERR 83886179 Operation cancelled <Pinentry>
gpg: signing failed: Operation cancelled

ด้านบนแสดงว่ามีปัญหาบางอย่างกับpinentryโปรแกรม ปกติแล้ว Gpg จะทำงานpinentry-cursesเพื่อฉันดังนั้นฉันจึงเปลี่ยนเป็นpinentry-tty(ฉันต้องทำaptitude installก่อน) และข้อผิดพลาดก็หายไป (แม้ว่าฉันจะไม่ได้รับรหัสผ่านแบบเต็มหน้าจออีกต่อไป เพื่อให้การเปลี่ยนแปลงนี้ผมมีการเพิ่มสายpinentry-program /usr/bin/pinentry-ttyการ~/.gnupg/gpg-agent.confและฆ่าตัวแทนด้วยgpgconf --kill gpg-agent(จะได้รับการเริ่มต้นใหม่ในครั้งต่อไป)


1

ดูเหมือนว่าไม่มีคำตอบข้างต้นที่ตรงกับปัญหาของฉัน มีการติดตั้งgpgไบนารีของฉัน( /usr/local/bin/gpg -> /usr/local/MacGPG2/bin/gpg2) เป็นส่วนหนึ่งของGPG Suiteแทนการสร้าง

อย่างไรก็ตามฉันรู้สึกว่าคำแนะนำต้มลงไปที่: "ใช้gpgไบนารี่แบบไหนก็ได้ที่มีล่าสุดในการชง" ดังนั้นฉันจึงพยายาม:

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

ฉันตรวจสอบว่าฉันได้เปลี่ยนอย่างถูกต้องgpgตามที่ฉัน$PATHจะชี้ไปที่ปฏิบัติการใหม่จากชง:

🍔 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

และฉันยังบอกอย่างชัดเจนว่าคอมไพล์gpgใช้ไบนารี่:

git config --global gpg.program gpg

บางทีมันอาจจะไม่กันน้ำเพราะมันไวต่อเส้นทาง gpgฉันไม่ได้จริงไปไกลเท่าที่ยืนยันเกินสงสัยว่าคอมไพล์ได้เปลี่ยนไปกล่าวอ้างชง

ไม่ว่าในกรณีใด ๆ : ไม่มีสิ่งใดที่เพียงพอที่จะทำให้การgit commitเซ็นสัญญาของฉันสำเร็จอีกครั้ง


สิ่งที่ทำงานสำหรับฉันในท้ายที่สุดคือการอัปเดตจีพีจีสวีท ฉันใช้งานเวอร์ชัน 2016.7 และฉันพบว่าการอัปเดตเป็น 2016.10 ได้แก้ไขปัญหาให้ฉันแล้ว

ฉันเปิดGPG Keychain.appแล้วกด "ตรวจสอบการอัปเดต ... " ด้วยเวอร์ชั่นใหม่: คอมมิชชันที่ลงนามแล้วจะทำงานได้อย่างถูกต้องอีกครั้ง


ฉันพยายามอัปเดตเป็นเวอร์ชันล่าสุด ... แต่ก็ไม่ได้ผลเหมือนกัน พยายามลงชื่อเข้าใช้ xcode
อัลเบิร์ตต. วงศ์


1

ฉันชอบ @birchlabs มากหลังจากขุดค้น / ค้นหาฉันพบว่าไม่ใช่ GPG แต่เป็น GPG Suite ฉันทำcask reinstall gpg-suiteและแก้ไขมันให้ฉัน


0

หากสิ่งนี้เพิ่งเกิดขึ้นแบบสุ่มและทำงานได้อย่างสมบูรณ์แบบในอดีตเช่นกรณีของฉันลองออกจากระบบ ( cmd+shift+q) และลงชื่อกลับเข้าใช้งานได้สำหรับฉัน


0

ในกรณีของฉันไม่มีวิธีแก้ไขปัญหาที่กล่าวถึงในคำตอบอื่น ๆ ใช้งานได้ ฉันพบว่าปัญหานี้เกิดเฉพาะกับที่เก็บหนึ่งแห่ง การลบและการโคลน repo อีกครั้งสามารถแก้ไขปัญหาได้


0

เป็นประเภทที่แปลก แต่ต้องแน่ใจว่าเทอร์มินัลของคุณใหญ่พอ! คุณสามารถบอกได้ว่ามันเล็กไปหรือเปล่าโดยการวิ่งecho test | gpg --clearsignหรือเปล่า - มันจะให้ข้อความแสดงข้อผิดพลาดที่แจ้งให้คุณทราบ ถ้ามันไม่ใหญ่พอตัวแทน GPG ของคุณไม่สามารถแสดงกล่องเล็ก ๆ น้อย ๆ ของมัน

อันนี้จะไม่ใช้ถ้าคุณใช้ตัวแทน GUI หรือสิ่งที่ไม่ใช้ ncurses

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.