gpg không thể đăng nhập dữ liệu gây tử vong: không thể ghi đối tượng cam kết [Git 2.10.0]


319

Tôi đã theo dõi một vài bài viết về các thuộc tính đẹp trên ghi chú phát hành Git 2.10 . Đi qua đó đã nâng cấp git lên 2.10.0 và thực hiện các thay đổi đối với .gitconfigkết quả toàn cầu như sau -

[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

Nhưng bây giờ tôi cố gắng ký cam kết của mình bằng cách sử dụng

git commit -a -S -m "message"

Tôi nhận thấy lỗi sau -

Bạn cần một cụm mật khẩu để mở khóa bí mật cho

người dùng: "XYZ (Đã ký kỹ thuật số)"

Khóa RSA 2048 bit, ID AAAAAAAA, được tạo 2016-07-01

lỗi: gpg không thể đăng nhập dữ liệu gây tử vong: không thể ghi đối tượng cam kết

Lưu ý - Tôi vẫn có thể cam kết thay đổi bằng cách sử dụnggit commit -a -m "message"

Có cách nào để khắc phục tương tự? Hoặc bất kỳ thay đổi cần thiết trong cấu hình gpgđể có được cùng với việc nâng cấp git?


Cập nhật 1

Cũng đang tìm kiếm sự hữu ích hơn nữa, sau đây Có cách nào để "tự động gán" các cam kết trong Git bằng khóa GPG không? . Tôi đã cấu hình khóa bằng cách sử dụng

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

và rõ ràng là nhận được cùng một lỗi dù sao.


3
Tôi phải đối mặt với vấn đề tương tự. Tôi đã gỡ cài đặt Git 2.8 (git-scm) trên Windows. Và cài đặt 2.10. Bây giờ tôi nhận được gpg failed to sign the datamỗi khi tôi sử dụng -S. Trong 2.8, tôi có thể ký một cam kết mà không có vấn đề. Tôi không biết chuyện gì xảy ra.
Đèn chiếu sáng

5
Thêm user.signingkeycố định vấn đề của tôi, đủ lạ.
Xavier Hồ

1
@nullpulum Tôi đã xóa câu trả lời của mình từ đó, vì sau khi nhìn sâu, tôi nhận ra đó là một bản sao!
Shaya Amani

1
Thật trớ trêu, tôi đã thay đổi máy của mình để thiết lập mọi thứ ngay từ đầu và cuối cùng tìm kiếm câu hỏi của riêng tôi và không có giải pháp được đề xuất nào có vẻ đủ sạch để tôi chỉ bắt đầu đơn giản.
Naman

1
Đối với tôi, sửa là: git config user.namewas! = Name được sử dụng khi tạo khóa PGP
stacksonstacks

Câu trả lời:


464

Tôi gặp vấn đề này với OSX.

Câu trả lời gốc:

Nó có vẻ như một bản cập nhật gpg (của brew) đã thay đổi vị trí của gpgđể gpg1, bạn có thể thay đổi nhị phân, nơi vẻ git lên gpg:

git config --global gpg.program gpg1

Nếu bạn không có gpg1 : brew install gpg1.

Cập nhật câu trả lời:

Có vẻ như gpg1 đang bị phản đối / "nhẹ nhàng sử dụng" , vì vậy bạn có thể thực sự nên cập nhật lên gpg2, thật không may, điều này liên quan đến khá nhiều bước / một chút thời gian:

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

Phần đầu tiên cài đặt gpg2 và phần sau là hack cần thiết để sử dụng nó . Để khắc phục sự cố, hãy xem câu trả lời này (mặc dù đó là về linux không pha), nó gợi ý một thử nghiệm tốt:

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

Nếu thử nghiệm này thành công (không có lỗi / đầu ra bao gồm chữ ký PGP), bạn đã cập nhật thành công lên phiên bản gpg mới nhất.

Bây giờ bạn có thể sử dụng ký git một lần nữa!
Điều đáng chú ý là bạn sẽ cần phải có:

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

Lưu ý: Sau khi bạn đã chạy một cam kết đã ký, bạn có thể xác minh nó đã ký với:

git log --show-signature -1

trong đó sẽ bao gồm thông tin gpg cho lần xác nhận cuối cùng.


7
Đặt gpg.program thành / usr / local / bin / gpg (không có "1") đã sửa nó cho tôi.
Iskar

5
Có vẻ như một bản cập nhật gnupg2bị brewrối với symlink do đó gpgđã bị xóa, tôi đã sửa các liên kết bằng cách sử dụng brew link --overwrite gnupg2.
Brice

8
hm ... không hoạt động vẫn đưa ra lỗi của tôi khi đăng nhập xcode.
Albert T. Wong

1
@DrBeco không phải là vị trí / hành vi ban đầu? Tôi vẫn gặp vấn đề tương tự trên osx (tôi nghĩ rằng tôi đã cập nhật bia của mình khá gần đây), gpg1vẫn là bản thực thi được xuất.
Andy Hayden

29
killall gpg-agent && gpg-agent --daemon --use-standard-socket --pinentry-program /usr/local/bin/pinentrycuối cùng đã sửa nó cho tôi
Dan Bechard

317

Nếu gnupg2 và gpg-agent 2.x được sử dụng, hãy đảm bảo đặt biến môi trường GPG_TTY.

export GPG_TTY=$(tty)

Xem tài liệu của GPG về các vấn đề phổ biến .


17
Nếu sử dụng cá, đưa set -x GPG_TTY (tty)vào hồ sơ của bạn.
fasfsfss

@StuartCardall Điểm của lệnh chown là gì? Thông thường, nó sẽ được gán cho bạn bởi một quy trình hệ thống, khi bạn đăng nhập hoặc tạo giả. Nếu nó thuộc sở hữu của người khác và bạn không root, nó sẽ thất bại. Nếu nhóm là một cái gì đó khác, nó có thể không thành vấn đề và người dùng thường sẽ không ở trong nhóm tty.
poolie

@poolie - nó quan trọng nếu bạn suđể roottrên một máy chủ từ xa
Stuart Cardall

6
Tôi đã thêm biến vào ~/.zshrcvà tôi có thể thực hiện lại cam kết, bây giờ nó kết nối chính xác với thiết bị đầu cuối. Cảm ơn tất cả sự giúp đỡ của bạn!
Alex Gurrola

Đây cũng là trong các hướng dẫn GitHub: help.github.com/articles/telling-git-about-your-gpg-key
bonh

198

Nếu mọi thứ đều thất bại, hãy sử dụng GIT_TRACE=1để thử và xem git đang làm gì:

$ 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

Bây giờ chạy lệnh failing thủ công:

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

Hóa ra, chìa khóa của tôi đã hết hạn, gitkhông đáng trách.


34
Mẹo hay để gỡ lỗi. +1
VonC

4
Điều này thực sự đã giúp tôi giải quyết vấn đề của riêng mình và đó là giải pháp cho mọi loại vấn đề với thông báo trạng thái này. +1
xHocquet

Cảm ơn cho việc gỡ lỗi đi qua. Chìa khóa của tôi đã hết hạn
Sgnl

2
Cảm ơn! Điều này dẫn tôi đến vấn đề của tôi. Thật kỳ lạ, địa phương của tôi .git/configđã có một namedự án cụ thể không phù hợp với email ký của tôi. Thế là đủ để từ chối nó.
kross

1
Chà, thực thi gpg -bsau <key>trên máy của tôi không thực hiện bất cứ điều gì. Đây có phải là giả sử để mất quá nhiều thời gian để thực hiện? Hoặc điều đó có nghĩa là chìa khóa là tốt để được sử dụng? @VonC có hiểu biết gì không?
Naman

82

Tôi đã Làm nó qua chuyện này ngắndễ dàng công thức:

Tự động ký cam kết trên macOS (Toàn cầu và với các IDE khác nhau):

Nhận của bạn signingkeytrong cách này .

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

Đặt các mục sau trong gpg.conftệp (chỉnh sửa tệp bằng nano ~/.gnupg/gpg.conflệnh):

no-tty

Đặt các mục sau trong gpg-agent.conftệp (chỉnh sửa tệp bằng nano ~/.gnupg/gpg-agent.conflệnh):

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

Cập nhật :

Bạn có thể cần phải thực thi killall gpg-agentlệnh sau khi chỉnh sửa tệp cấu hình gpg.conf, theo các bình luận. Như lệnh tự giải thích nói, lệnh này sẽ chấm dứt tác nhân GPG (Gnu Privacy Guard).


2
Bạn cũng có thể giải thích những gì các lệnh đang làm? Nó sẽ giúp với sự hiểu biết.
Một Droid

7
Tôi cũng đã phải chạy một killall gpg-agentsau khi thiết lập các tập tin cấu hình, sau đó nó hoạt động!
Pascal Ludwig

Làm thế nào để chúng ta biết chúng ta có thể tin tưởng những người phía sau pinentry-mac? Tôi không nói chúng ta không thể, nhưng GPGTools org được sao lưu bởi một nhóm rất nhỏ và repo chỉ có 5 người đóng góp so với việc sử dụng brew install gnupgđòn bẩy cho công việc của gnupg.org .
sunknudsen

Trong trường hợp nó giúp được người khác, vấn đề của tôi là tôi đã có một bộ cục bộ không hợp lệ user.signingkey, điều mà tôi không nhận thấy trong cấu hình sourcetree của mình, cũng như các cài đặt toàn cầu của tôi (vì tôi không nghĩ là nhìn vào cấu hình cục bộ) Đảm bảo cả cục bộ ( git config --local --get user.signingkey) và toàn cầu ( git config --global --get user.signingkey) là như nhau, hoặc thậm chí tốt hơn, bỏ đặt địa phương nếu nó không hợp lệ ( git config --local --unset user.signingkey)
Glenn 'devalias'

trên OSX (10.13.06), nó đưa ra lỗi sau, bash: pinentry-program: không tìm thấy lệnh
cgl

59

Có thể giúp giết quá trình gpg-agentcó thể bị mắc kẹt với dữ liệu cũ. Vì vậy, mới gpg-agentbắt đầu sẽ yêu cầu mật khẩu.


2
Điều này đã làm điều đó cho tôi.
danyim

12
Sử dụng gpg-agent --daemonđể bắt đầu nó
FooBar

1
tôi cũng phải khởi động lại gpg-agent
GnrlBzik

8
Để tiêu diệt quá trình trên macOS:killall gpg-agent
inceaf

1
trên Ubuntugpgconf --kill gpg-agent
Adam

38

Thực hiện theo các url dưới đây để thiết lập cam kết đã ký https://help.github.com/en/articles/telling-git-about-your-signing-key

nếu vẫn nhận được gpg không thể đăng nhập dữ liệu gây tử vong: không thể ghi đối tượng cam kết

Đây không phải là vấn đề với git, đây là với GPG, hãy làm theo các bước dưới đây

1.gpg --version

  1. echo "test" | gpg --clearsign

nếu nó đang hiển thị:

gpg: signing failed: Inappropriate ioctl for device
gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device
  1. sau đó sử dụng export GPG_TTY=$(tty)

4. sau đó thử lại echo "test" | gpg --clearsign chữ ký PGP.

  1. git config -l | grep gpg

gpg.program = gpg commit.gpgsign = true

6. vui vẻ git commit -S -m "commitMsz"


1
đây là giải pháp cho tôi Cảm ơn rất nhiều!
upInCloud

Hướng dẫn tuyệt vời về cách tìm hiểu xem đây có phải là vấn đề không.
Philippe

Đây là những gì đã làm cho tôi. Cảm ơn rất nhiều!
Allan Guwatudde

export GPG_TTY=$(tty)là mánh khóe Đã thêm nó vào .zshrctập tin của tôi
Shane Stillwell

22

Đối với bất kỳ ai đang gặp phải vấn đề này trên máy MacOS , hãy thử điều này:

  1. brew uninstall gpg
  2. brew install gpg2
  3. brew install pinentry-mac (Nếu cần thiết)
  4. gpg --full-generate-key Tạo một khóa bằng cách sử dụng một thuật toán.
  5. Nhận khóa được tạo bằng cách thực thi: gpg --list-keys
  6. Đặt chìa khóa ở đây 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. Nếu bạn muốn xuất Khóa của mình sang GitHub thì: gpg --armor --export <key> và thêm khóa này vào GitHub tại các khóa GPG: https://github.com/sinstall/keys (bao gồm cả dòng START và END)

Nếu vấn đề vẫn còn tồn tại:

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

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

Nếu vấn đề vẫn còn tồn tại:

Cài đặt https://gpgtools.org và ký vào khóa mà bạn đã sử dụng bằng cách nhấn Sign từ thanh menu: Key -> Sign

Nếu vấn đề vẫn còn tồn tại:

Tới: toàn cầu của bạn .gitconfigtập tin mà trong trường hợp của tôi là: /Users/gent/.gitconfig Và thay đổi .gitconfig tập tin (hãy chắc chắn rằng email và Tên đều giống nhau với một mà bạn đã tạo trong khi tạo Key) :

[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
Thêm 'gpsign = true' trong .gitconfig đã sửa nó cho tôi
Pierre

18

Hai xu của tôi ở đây:

Khi bạn tạo và thêm khóa vào gpg-agent, bạn xác định một cái gì đó được gọi passphrase. Bây giờ passphraseđến một lúc nào đó hết hạn và gpgcần bạn nhập lại để mở khóa để bạn có thể bắt đầu đăng nhập lại.

Khi bạn sử dụng bất kỳ chương trình nào khác có giao diện gpg, gpglời nhắc cho bạn nhập cụm mật khẩu của bạn sẽ không xuất hiện (về cơ bản gpg-agentkhi daemonized có thể hiển thị cho bạn hộp thoại nhập stdin).

Sau đó, một trong những giải pháp là gpg --sign a_file.txtnhập cụm mật khẩu mà bạn đã nhập khi tạo khóa và sau đó mọi thứ sẽ ổn ( gpg-agentnên tự động ký)

Xem câu trả lời này về cách đặt thời gian chờ dài hơn cho cụm mật khẩu của bạn để bạn không phải làm điều này mọi lúc.

Hoặc bạn hoàn toàn có thể xóa cụm mật khẩu bằng ssh-keygen -p

Chỉnh sửa: Thực hiện man gpg-agentđể đọc một số nội dung về cách để các điều trên xảy ra tự động và thêm các dòng:

GPG_TTY=$(tty)
export GPG_TTY

trên .bashrc của bạn nếu bạn đang sử dụng bash (đây là câu trả lời đúng nhưng tôi cũng đang giữ ý nghĩ của mình ở trên)


Cảm ơn @ george-daramouskas, đây là vấn đề của tôi.
Nic Barker

10

Cập nhật tháng 10 năm 2016: vấn đề 871 đã đề cập "Việc ký kết ngừng hoạt động trong Git 2.9.3"

Git cho Windows 2.10.1 được phát hành hai ngày trước (ngày 4 tháng 10 năm 2016) đã sửa lỗi xác nhận và gắn thẻ GPG tương tác.

sự thay đổi dấu gpg gần đây trong git (không có vấn đề gì với Linux) làm lộ ra một vấn đề theo cách mà trên Windows, không phải MSYS2-git tương tác với MSYS2-gpg.


Câu trả lời gốc:

Đọc " 7.4 Công cụ Git - Ký kết công việc của bạn ", tôi giả sử bạn có user.signingkeybộ cấu hình "".

Lần tái cấu trúc lớn cuối cùng (trước Git 2.10) xung quanh gpg là trong cam kết 2f47eae2a , ở đây thông báo lỗi đã được chuyển đếngpg-interface.c

Một nhật ký trên tệp đó cho thấy sự thay đổi gần đây trong cam kết af2b21e (Git 2.10)

gpg2 đã sử dụng định dạng dài theo mặc định, nhưng hầu hết các bản phân phối dường như vẫn có "gpg" là phiên bản 1.x cũ hơn vì lý do tương thích. Và các phiên bản cũ hơn của gpg chỉ hiển thị ID ngắn 32 bit, khá không an toàn.

Điều này thực sự không quan trọng đối với việc xác minh : nếu xác minh được thông qua, chữ ký pgp là tốt.
Nhưng nếu bạn chưa thực sự có khóa và muốn tìm nạp nó hoặc bạn muốn kiểm tra chính xác khóa nào được sử dụng để xác minh và muốn kiểm tra nó, chúng ta nên chỉ định khóa với độ chính xác cao hơn.

Vì vậy, hãy kiểm tra cách bạn đã chỉ định user.signingkeycấu hình của mình và phiên bản gpg bạn đang sử dụng (gpg1 hoặc gpg2), để xem liệu chúng có ảnh hưởng gì đến thông báo lỗi không.

Ngoài ra còn có cam kết 0581b54 thay đổi điều kiện cho thông gpg failed to sign the databáo lỗi (bổ sung cho cam kết 0d2b664 ):

Hiện tại chúng tôi không đọc từ stderr. Tuy nhiên, chúng tôi sẽ muốn trong một bản vá trong tương lai, vì vậy điều này cũng chuẩn bị cho chúng tôi ở đó (và trong trường hợp đó gpg sẽ viết trước khi đọc tất cả các đầu vào, mặc dù một lần nữa, không chắc là khóa uid sẽ lấp đầy bộ đệm ống).

Cam kết 4322353 cho thấy gpg hiện sử dụng một tệp tạm thời, do đó có thể có các vấn đề đúng xung quanh đó.

Hãy chuyển đổi sang sử dụng một đối tượng tempfile, xử lý các trường hợp khó cho chúng ta và thêm cuộc gọi dọn dẹp bị thiếu.


Tôi có user.signingkeybộ cấu hình của tôi . Cũng sử dụng gpg (GnuPG) 2.0.3.
Naman

@nullpulum Tôi đã chỉnh sửa câu trả lời của mình. Bạn có thể kiểm tra xem sự cố vẫn còn với Gti cho Windows 2.10.1.
VonC

xin lỗi vì cập nhật muộn, làm việc trên MacOSX không phải Windows nên không thể xác minh điều này.
Naman

10

Dấu vết git rất lộ liễu cho tình huống của tôi ...

   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

Tôi cần tạo khóa ban đầu theo định dạng gitđang kiểm tra. Tốt nhất là sao chép giá trị được chuyển lên -bsautrên trong nhật ký và sử dụng bên dưới.

Vì vậy, nó trở thành,

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

Sau đó, nó làm việc.

Mong rằng sẽ giúp.


Điều này làm việc cho tôi và git tracethực sự hữu ích.
philip oghenerobo balogun 7/2/19

1
bạn đời ... bạn không thể hình dung được tôi đã dành bao nhiêu giờ để cố gắng sắp xếp điều này cho đến khi tôi đạt được Câu trả lời của bạn ... đó là cách đặt tên của khóa cùng .. cảm ơn bạn! cảm ơn bạn! cảm ơn bạn!
giomanda

8

Sử dụng cygwin, gần đây tôi đã chuyển sang gpg2. Sau đó, tôi đã gặp vấn đề tương tự khi ký với git sau khi thiết lậpgit config gpg.program gpg2 .

Hãy thử echo "test" | gpg2 --clearsignxem gpg2 có hoạt động không. Tôi thấy đó là giải pháp đơn giản nhất để thiết lập git config gpg.program gpg, bởi vì nó hoạt động. Nhưng bạn cũng sẽ nhận được một lỗi tốt hơn theo cách này - ví dụ: bạn cần cài đặt pinentry.


Trên thực tế, trên một số bản phân phối Linux, bạn có thể gặp phải vấn đề tương tự. Git luôn sử dụng gpg, không phải gpg2. Xem thêm: stackoverflow.com/questions/34766123/
Mạnh

Điều này tiết lộ cho tôi các lỗi gpg: signing failed: Inappropriate ioctl for devicecó thể được giải quyết bằng export GPG_TTY=$(tty). Nguồn: github.com/keybase/keybase-issues/issues/2798
swiknaba 19/12/18

8

Trên OS X, sử dụng gnupg2thông qua brew tôi chỉ phải giết tác nhân gpg , đôi khi xảy ra:

pkill -9 gpg-agent

Và đặt envbiến nếu cần:

export GPG_TTY=$(tty)

Xem các vấn đề GPG thường gặp cũng và câu trả lời này ở đây quá.


2
Cái này cũng có tác dụng với tôi. Tôi đã tạo ra một bí danh mới alias fix-gpg='pkill -9 gpg-agent && export GPG_TTY=$(tty)'.
oalder

1
Điều này hoạt động tốt, cảm ơn. Thậm chí không cần đặt biến env sau đó.
Nick Rameau

8

Tôi đã thấy những câu trả lời tương tự, nhưng không có gì chính xác như những gì làm việc cho tôi. Trên Linux, tôi đã phải giết và khởi động lại gpg-agentvới:

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

Điều này đã lừa tôi. Có vẻ như bạn cần phải user.signingkeyđặt khóa riêng của mình cũng như những gì một số ý kiến ​​khác đang nói.

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


6

Tôi đã gặp lỗi này trên Ubuntu 18.04 và hóa ra khóa của tôi đã hết hạn .

Để thấy điều này, tôi đã chạy nó và nó xác nhận rằng các khóa của tôi đã hết hạn:

gpg --list-keys

Để sửa lỗi này, tôi đã chạy (sử dụng ID được hiển thị trong lệnh trước):

gpg --edit-key <ID>

Từ đó, tôi đã gia hạn hết hạn key 0và làm key 1theo các hướng dẫn này để thực hiện thao tác gõ key 0sau đó expirevà làm theo các hướng dẫn. Sau đó lặp lại cho key 1.

Sau đó, để kiểm tra điều này, tôi đã chạy:

echo test | gpg --clearsign

Và trước khi sửa, nó đã thất bại với lỗi:

gpg: không có khóa bí mật mặc định: Không có khóa bí mật
gpg: [stdin]: xóa dấu hiệu không thành công: Không có khóa bí mật

Nhưng sau khi sửa, lệnh tương tự đã ký thành công thông báo để tôi biết mọi thứ đang hoạt động trở lại!


Xác nhận sự cố này đã khắc phục sự cố khi nhập khóa hợp lệ từ Mac OSX Catalina sang CentOS7. Đã suy nghĩ với con thú này trong hơn hai giờ cố gắng tìm ra lý do tại sao nó cứ hỏi mật khẩu trong số những thứ khác. Thật kỳ lạ, nó đã được thiết lập để không bao giờ hết hạn, và tôi đặt nó vẫn không bao giờ hết hạn.
Cody B

5

Tôi gặp vấn đề tương tự. Tôi rất vui khi báo cáo rằng vấn đề không nằm ở git 2.10.0mà với gnupg 1.4.21.

Tạm thời hạ gnupg xuống 1.4.20 đã khắc phục sự cố cho tôi.

Nếu bạn đang sử dụng homebrew và bạn đã nâng cấp các gói của mình như tôi đã làm, có lẽ bạn chỉ có thể chạy brew switch gnupg 1.4.20để hoàn nguyên.


3

Hãy chắc chắn rằng bạn đã đặt email đúng cách.

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

1
Đây là giải pháp duy nhất hiệu quả với tôi, rất hữu ích khi làm theo đúng phương pháp tạo khóa GPG thông qua github
Naz

1
Trong trường hợp của tôi, vấn đề là tôi đã sử dụng e-mail của công ty trong một repo cụ thể mà tôi không tạo khóa PGP.
rubick

3

Nếu email liên quan đến khóa GPG của bạn khác với email bạn đang sử dụng trong git, bạn sẽ cần thêm id người dùng khác vào khóa HOẶC sử dụng khóa mà email khớp chính xác.

Bạn có thể thêm một UID khác bằng cách sử dụng:

$ gpg --edit-key

Xem cho mo /superuser/293184/one-gnupg-pgp-key- Pair-two-emails


1
Đây là nó cho tôi. Chúa ơi, làm thế nào không có thông báo lỗi nhiều thông tin hơn "không thể ký dữ liệu".
Alec

3

Tôi đã vô tình cập nhật gpg bằng cách nào đó bởi vì tôi đã nhận được điều này sau khi thử kiểm tra nếu gpg hoạt động:

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.

Chạy gpgconf --kill allcố định nó cho tôi.

Hy vọng điều này sẽ giúp được ai đó.


2

Tôi gặp vấn đề tương tự với các nguồn Git mới nhất (2.12.2) được xây dựng cùng với các nguồn mới nhất của tất cả các phụ thuộc của nó (Zlib, Bzip, cURL, PCRE, ReadLine, IDN2, iConv, Unistring, v.v.).

Hóa ra libreadlinelà đã đưa ra các vấn đề về GnuPG:

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

Và tất nhiên, cố gắng để có được thông tin hữu ích từ Git với -vvvthất bại, vì vậy thất bại là một bí ẩn.

Để giải quyết lỗi PGP do ReadLine, hãy làm theo các hướng dẫn tại Không thể cập nhật hoặc sử dụng trình quản lý gói - lỗi gpg :

Trong thiết bị đầu cuối:

ls /usr/local/lib

Có một loạt các libs đọc trong đó (libreadline.so.BLAH-BLAH) vì vậy tôi:

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

2

Các câu trả lời ở trên rất hay nhưng chúng không hiệu quả với tôi. Điều giải quyết vấn đề của tôi là xuất khẩu cả công khaibí mật khóa .

liệt kê các khóa từ máy mà chúng tôi đang xuất từ

$ 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

xuất các phím

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

đi đến máy chúng tôi đang nhập và nhập

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

bingo bongo, bạn đã hoàn tất!

tham khảo: https://www.debfox.org/how-to-importexport-gpg-key- Pair /

ps. Các khóa của tôi ban đầu được tạo trên bootcamp windows 7 và tôi đã xuất chúng lên máy mac của tôi (cùng một máy vật lý, khác nhau hầu như)


2

Tôi đang dùng Ubuntu 18.04 và gặp lỗi tương tự, tôi cũng lo lắng trong nhiều tuần. Cuối cùng nhận ra rằng gpg2 không hướng tới bất cứ điều gì. Vì vậy, chỉ cần chạy

git config --global gpg.program gpg

Và tada, nó hoạt động như sự quyến rũ.

Đã ký cam kết

Cam kết của bạn bây giờ sẽ có thẻ xác minh với họ.


2

Tôi vấp phải lỗi này không phải vì bất kỳ vấn đề cấu hình nào, mà vì khóa của tôi đã hết hạn. Cách dễ nhất để mở rộng tính hợp lệ của nó trên OSX là mở ứng dụng GPG Keychain (nếu bạn đã cài đặt nó) và nó sẽ tự động nhắc bạn mở rộng nó. Hai lần nhấp, và bạn đã hoàn tất. Hy vọng rằng điều này sẽ giúp các nhân viên Google :)


2

Điều này bắt đầu xảy ra bất ngờ đối với tôi trên Ubuntu, không chắc là một số cập nhật gần đây đã làm điều đó, nhưng không có vấn đề nào hiện có thể áp dụng cho tôi (tôi đã GPG_TTYđặt ra, đã thử giết tác nhân, v.v.). Lệnh độc lập gpgđã thất bại với lỗi này:

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

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

Tôi đã thử chạy gpgvới --debug-alltùy chọn và nhận thấy đầu ra bên dưới:

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

Ở trên chỉ ra rằng có một số vấn đề với pinentrychương trình. Gpg thường chạy pinentry-cursescho tôi, vì vậy tôi đã đổi nó thành pinentry-tty(tôi phải sửa aptitude installnó trước) và lỗi đã biến mất (mặc dù tôi không còn nhận được mục nhập mật khẩu toàn màn hình, nhưng dù sao tôi cũng không thích điều đó). Để thực hiện thay đổi này, tôi đã phải thêm dòng pinentry-program /usr/bin/pinentry-ttyvào ~/.gnupg/gpg-agent.confvà tiêu diệt tác nhân gpgconf --kill gpg-agent(nó sẽ được khởi động lại vào lần tiếp theo).


1

Không có câu trả lời nào ở trên có vẻ phù hợp với vấn đề của tôi. gpgNhị phân của tôi ( /usr/local/bin/gpg -> /usr/local/MacGPG2/bin/gpg2) đã được cài đặt như một phần của GPG Suite , chứ không phải bởi brew.

Tuy nhiên, tôi cảm thấy rằng lời khuyên đã rút ra: "sử dụng bất kỳ gpgnhị phân nào là mới nhất có sẵn trên bia". Vì vậy, tôi đã cố gắng:

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

Tôi xác minh rằng tôi đã thay đổi chính xác gpgkhi tôi $PATHtrỏ đến tệp thực thi mới từ 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

Và tôi cũng nói rõ ràng với git gpgnên sử dụng nhị phân nào:

git config --global gpg.program gpg

Chà, có lẽ điều đó không hoàn toàn kín nước, vì nó nhạy cảm với đường đi. Tôi đã không thực sự đi xa đến mức xác nhận vượt quá nghi ngờ rằng git đã chuyển sang gọi bia gpg.

Trong mọi trường hợp: không điều nào trong số này là đủ để thực hiện git committhành công cam kết của tôi một lần nữa.


Điều làm việc cho tôi cuối cùng là cập nhật GPG Suite . Tôi đang chạy phiên bản 2016.7 và tôi thấy rằng việc cập nhật lên 2016.10 đã khắc phục sự cố cho tôi.

Tôi đã mở GPG Keychain.appvà nhấn "Kiểm tra cập nhật". Với phiên bản mới: các cam kết đã ký hoạt động chính xác trở lại.


Tôi đã thử cập nhật lên phiên bản mới nhất ... cũng không hoạt động. cố gắng đăng nhập xcode.
Albert T. Wong

1

có được thiết lập bằng cách đơn giản:

brew uninstall gpg 

brew install gpg2

1

Rất giống như @birchlabs, sau rất nhiều lần tìm kiếm / tìm kiếm, tôi thấy rằng đó không phải là GPG, mà là GPG Suite. Tôi đã làm cask reinstall gpg-suitevà nó đã giải quyết nó cho tôi.


0

Nếu điều này chỉ xảy ra ngẫu nhiên và đã hoạt động hoàn hảo trong quá khứ, như trường hợp của tôi, hãy thử đăng xuất ( cmd+shift+q) và đăng nhập lại. Đã làm việc cho tôi


0

Trong trường hợp của tôi, không có giải pháp nào được đề cập trong câu trả lời khác có hiệu quả. Tôi phát hiện ra rằng vấn đề là dành riêng cho một kho lưu trữ. Xóa và nhân bản repo một lần nữa giải quyết vấn đề.


0

Một loại kỳ lạ, nhưng hãy chắc chắn rằng thiết bị đầu cuối của bạn đủ lớn! Bạn có thể biết nếu nó quá nhỏ bằng cách chạyecho test | gpg --clearsign - nó sẽ cung cấp cho bạn một thông báo lỗi khá rõ ràng cho bạn biết. Nếu nó không đủ lớn, đại lý GPG của bạn không thể hiển thị hộp nhỏ của nó.

Điều này sẽ không áp dụng nếu bạn sử dụng một tác nhân GUI hoặc một cái gì đó không sử dụng ncurses.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.