git提交签名失败:秘钥不可用。

201

当我试图使用Git提交时,出现了这个错误。

gpg: skipped "name <name@mail.com>": secret key not available
gpg: signing failed: secret key not available
error: gpg failed to sign the data
fatal: failed to write commit object

我已经生成了一个新的密钥,但是它仍然出现相同的错误。

gpg --list-keys
~/.gnupg/pubring.gpg
--------------------------------
pub   2048R/35F5FFB2 2016-04-23
uid                  name (New key) <name@mail.com>
sub   2048R/112A8C2D 2016-04-23

密钥与上述相同

我找到了这个为Git标记生成GPG密钥并按照步骤进行了操作,但仍然无法正常工作,有任何想法吗?


8
对于Windows用户来说,遇到这个错误的可能性更大,因为Windows上的Git没有使用正确的gpg。如果在PATH中找不到正确的二进制文件,Git将会使用内置在其压缩的MSYS中的gpg,这个gpg不知道您的密钥在哪里。设置gpg.program或G(NU)PGHOME变量可以解决此问题,如下面几个答案中所述。 - Abel Cheung
13个回答

313

这对我在Windows 10上起作用(请注意,我使用gpg.exe的绝对路径):

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

在修复之前,我收到了以下错误:

gpg: skipped "3E81C*******": secret key not available
gpg: signing failed: secret key not available
error: gpg failed to sign the data
fatal: failed to write commit object

13
使用 VS Code 时出现“未找到密钥”的错误,通过设置 gpg.exe 的位置可以解决该问题。 - Dawid
2
这对我也起作用了。特别是在遵循github的配置步骤之后。 - Bas G
1
每次我的Windows Insider版本安装后,这个选项都会重置。感谢您的帮助 :) - VRG
8
是的,这很重要,因为Git有自己的GPG,并且大多数人会安装Windows上的GPG,通过Kleopatra导入私钥,只有“主”GPG才知道密钥位置。好答案。 - Pawel Cioch
在做完这些之后,我仍然遇到了错误。最终发现是因为GitHub的指南不够清晰,并且我还设置了x509签名选项。打开你的%USERPROFILE%\.gitconfig文件并删除任何与x509相关的设置。希望这能帮助其他人! :) - Kip
显示剩余3条评论

145

在使用之前,您需要配置密钥。

git config user.signingkey 35F5FFB2

如果您想为每个仓库使用相同的密钥,请全局声明它。

git config --global user.signingkey 35F5FFB2

来源: Git工具 - 签署你的工作


太好了!同时指定用户的签名密钥也可以避免在一个密钥上有多个电子邮件地址以及git电子邮件和密钥上第一个地址不匹配的问题。 - user2943160
1
在公共存储库中存储带有秘密密钥的.gitconfig文件是否安全? - melihovv
1
仅供记录,如 @melihovv 所问:秘钥必须在您的 GPG 密钥环中。只有该密钥的哈希 ID 存储在配置文件中。 - BRPocock
5
我必须执行这个命令,同时运行 git config --global gpg.program gpg2 - Splaktar
1
我在1.4.22版本中收到了一个口令对话框,但在v2版本中没有。一旦我执行git config --global gpg.program "C:/Program Files (x86)/GnuPG/bin/gpg.exe",它就会出现问题,并且我会收到“无密钥”错误。该怎么办? - Ini
显示剩余4条评论

78

对我有用的是添加

git config --global gpg.program "C:/Program Files (x86)/GNU/GnuPG/gpg2.exe"

如果您想找到gpg2.exe的完整路径:

where gpg2.exe

3
根据安装的 GnuPG 版本,您需要针对 gpg.exe 而不是 gpg2.exe 进行这个操作。 - Mark Rotteveel
1
谢谢,我的问题已经通过使用完整路径解决了(即 C:\Users\Me\AppData\Local\gnupg\bin\gpg.exe)。 - Bananasmoothii
谢谢!这对我有用。你救了我的一天 :)。我只是使用了"where gpg.exe",因为我没有"gpg2.exe"。 - libik

44

我最近遇到了同样的无法使用的密钥错误,以及一些其他错误,比如找不到GPG代理。

在我的情况下,我想让提交被签名,并在GitHub上显示为已验证。

以下是在Windows 10 x64上使其工作的完整步骤:

安装GPG

我使用winget安装了GPG 2.3.1,如下所示:

C:\> winget install GnuPG.GnuPG

验证方式:

C:\> gpg --version

生成 GPG 密钥

C:\> gpg --full-generate-key
  • 请填写您真实姓名和电子邮件地址,与GitHub账户使用的信息相同。

  • 密钥长度必须至少为4096位。

以ASCII装甲格式导出密钥

首先将密钥列出:

C:\> gpg --list-secret-keys --keyid-format=long

sec rsa4096/[短密钥] 2021-06-14 [SC]

然后导出它:

C:\> gpg --armor --export [short-key]

复制密钥,包括BEGIN/END文本。

-----BEGIN PGP PUBLIC KEY BLOCK-----
[huge-ascii-key]
-----END PGP PUBLIC KEY BLOCK-----

将 GPG ASCII 密钥添加到 GitHub 账户

进入 个人资料 > 设置 > SSH 和 GPG 密钥 > 新建 GPG 密钥

或者请按照这些视觉指南进行操作。

配置 Git 默认签名所有提交

C:\> git config --global user.signingkey [short-key]
C:\> git config --global commit.gpgsign true
C:\> git config --global gpg.program "C:/Program Files (x86)/gnupg/bin/gpg"

设置GPG代理的环境变量

检查GPG代理是否存在:

gpg-agent --version

设置环境变量:

GNUPGHOME=%USERPROFILE%\AppData\Roaming\gnupg

完成

生成的 .gitconfig 文件将包含以下用户信息部分:

[user]
    name = Your Name
    email = your@email.com
    signingkey = [short-key]
[commit]
    gpgsign = true
[gpg]
    program = C:/Program Files (x86)/gnupg/bin/gpg

3
谢谢,这真的很有帮助,应该选择为最佳答案。 - akmsw
2
在重复使用已在PATH中声明的“C:\ Program Files \ Git \ usr \ bin \ gpg.exe”后,它解决了我的问题。 - Robin Loxley
1
对我来说,唯一缺少的是设置GNUPGHOME环境变量,我必须将其设置为“%USERPROFILE%.gnupg”,因为这是默认安装位置。我使用默认的3072字节创建了我的密钥,而不是4096,它完美地工作了。 - Sideways S

18

我希望能够完成所有这些答案,因为我在处理这方面有很多问题。

这些示例使用--global标志,但如果您想在本地执行这些操作,可以将其删除。

在 git 中配置秘钥

git config --global user.signingkey 35F5FFB2

配置要在git中使用的gpg程序(可选)

一些系统(例如Ubuntu)可能同时拥有gpggpg2。您需要指定您将使用gpg2

git config --global gpg.program gpg2

导出 GPG_TTY(可选)

如果您在 ssh 环境中使用这些命令,则可能会出现以下错误:Inappropriate ioctl for devicegpg: échec de la signature : Ioctl() inapproprié pour un périphérique。您可以通过以下方式进行修复:

export GPG_TTY=$(tty)

自动启用 GPG 签名(可选)

git config --global commit.gpgsign true

如果您不再需要使用它,该如何禁用它? - Madona wambua
1
你可以在那些 git config 命令中添加 --unset 标志来禁用它。 - alphayax
我实际上使用了这个 git config --global commit.gpgsign true,但是说成了 false。 - Madona wambua

12

对我来说,使用"C:\Program Files\Git\usr\bin\gpg.exe"是解决方案。
必须卸载kleopatra。 它会导致gpg无法正常工作。

因此,总结一下:

  • 不需要kleopatra,改用GIT默认程序。

  • 翻译内容未提供。
git config --global user.signingkey Y0URK3Y
git config --global commit.gpgsign true
git config --global gpg.program "C:\Program Files\Git\usr\bin\gpg.exe"

1
在所有这些人中,你的和我一起工作过。 - Amr

11

我曾经在Windows 10电脑上遇到过相同的情况。

$ git commit -m "Improve logging, imports and show time executed"
gpg: signing failed: Operation cancelled
gpg: signing failed: Operation cancelled
error: gpg failed to sign the data
fatal: failed to write commit object

这两个命令 "C:\Program Files (x86)\GnuPG\bin\gpg.exe" --list-secret-keys --keyid-format LONGgpg --list-secret-keys --keyid-format LONG 返回的结果完全不同!

$ where gpg
C:\Program Files\Git\usr\bin\gpg.exe
C:\Program Files (x86)\GnuPG\bin\gpg.exe

主要原因与之前的答案有关,但是具有不同的意义:

  • 我正在使用已配置路径的git版本创建gpg密钥
  • Git配置为使用下载的gpg版本进行提交
  • 似乎GPG实现使用它们自己的证书数据库和存储

我希望这可以帮助任何遇到此问题且之前的答案无法解决的人。


不得不将秘钥添加到kleopatra中,从cli导出,因为visual studio community似乎默认使用它进行签名,而git cli使用了不同的列表/实现,因此仍然可以在没有kleopatra的情况下工作。 - Nithish
我把C:\Users\USERNAME\.gnupg下的所有内容复制到了C:\Users\USERNAME\AppData\Roaming\gnupg,问题解决了! - Mikael Dúi Bolinder

7

您需要设置变量GNUPGHOME。如果没有设置,GnuPG将无法找到您的密钥。

# On unix add it to your path

# On windows it will usually be under: 
<drive>:\Users\<username>\AppData\Roaming\gnupg

在Unix系统中,只需将其添加到路径中即可。
在Windows系统中,您需要打开控制面板并将其设置为。

System Variable
  Name: GNUPGHOME
  Path: <drive>:\Users\<username>\AppData\Roaming\gnupg

2
对我来说,它不是 GNUPGHOME。使用 GPGHOME 对我有效。 - Sysix

4
以下步骤帮助我解决了问题:
git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"

git config --global --unset gpg.format

gpg --list-secret-keys --keyid-format=long
// this will list the keys and copy the Key-ID

enter image description here

复制第一行中突出显示的密钥,并在下一个查询中使用Key-ID

git config --global user.signingkey <Key-ID>

git config --global commit.gpgsign true

我不得不在不同的机器上多次回顾这个建议!谢谢你提供的解决方案。这正是我所需要的。 - undefined
@MavaddatJavid 太棒了!很高兴知道它有帮助,如果对您有帮助,请给个赞以表示支持 :) - undefined

3

我曾遇到同样的问题,原因是git配置文件(.gitconfig)中用户名和邮箱与提供的gpg密钥不一致。我将它们改为相同后,问题得以解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接