在 Windows 下使用 Git 和 ssh-agent 进行 SSH 密钥签名

在 Windows 下使用 Git 和 ssh-agent 进行 SSH 密钥签名

情况

我在 Windows 下使用 Git 2.34,并GIT_SSH_COMMAND设置为 Windows OpenSSH 实现(它也设置在 上PATH)。我想将新的 Git SSH 密钥提交签名功能与 ssh-agent 结合使用。

我将我的 ed25519 密钥添加到 ssh-agent 并ssh-add -L打印正确的密钥。根据该输出,我将其用于.gitconfig

[commit]
    gpgsign = true
[gpg]
    format = ssh
[user]
    signingkey = ssh-ed25519 mykeyhere

当尝试签署提交时,出现以下错误消息:

error: Load key "C:\\Users\\myuser\\AppData\\Local\\Temp/.git_signing_key_tmp8eWdG0": invalid format?
fatal: failed to write commit object

我验证了的内容.git_signing_key_tmp8eWdG0是正确的(也是无 BOM 的 UTF-8)。我用它调试了 Git GIT_TRACE=1,它显示它使用了此命令行,从而产生了错误:

run-command.c:668       trace: run_command: ssh-keygen -Y sign -n git -f 'C:\Users\myuser\AppData\Local\Temp/.git_signing_key_tmp8eWdG0' 'C:\Users\myuser\AppData\Local\Temp/.git_signing_buffer_tmp8eWdG0'

但是,从上面的调试输出(一个ssh-keygen)手动执行相同的命令是有效的:

C:\>ssh-keygen -vvv -Y sign -n git -f C:\Users\myuser\AppData\Local\Temp/.git_signing_key_tmp8eWdG0 test.txt
Signing file test.txt
debug2: hash_file: hashed 4 bytes
debug3: hash_file: final hash: ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff
Write signature to test.txt.sig

因此我很好奇,删除了 OpenSSH,PATH然后重新运行提交过程,尽管ssh-keygen它不再可用,但它仍然显示签名错误:

C:\>where ssh-keygen
INFO: Could not find files for the given pattern(s).

这证明 Git 正在使用一些ssh-keygen似乎与 Windows OpenSSH 二进制文件不兼容的命令(它将按所示工作),但我找不到 Git 正在使用的这个二进制文件,也找不到修改所使用的二进制文件的方法(即使GIT_SSH_COMMAND设置正确并用于推送等所有其他目的)。

cmd.exe我在和上遇到了这个问题powershell.exe。我没有使用 Git bash。

问题

  1. 我该如何解决我的问题?
  2. 我怎样才能找出哪个ssh-keygenGit 正在使用?
  3. 我怎样才能改变ssh-keygen正在使用的 Git?
  4. 如何获得更详细的错误输出?

答案1

找到解决方案(讨论在 GitHub 上):

  1. 使用“使用外部 OpenSSH”重新安装 git(在安装开始时取消勾选“仅显示新选项”)
  2. 将 Windows 的 OpenSSH 更新到 8.6;(回购教程Unsupported certificate option "verify-time=20220125190555"); 如果没有它,则在使用以下方式浏览提交时会显示git show --show-signature

相关内容