验证签名git提交?

验证签名git提交?,git,Git,使用较新版本的git,可以使用PGP密钥对单个提交(以及标记)进行签名: git commit -m "some message" -S 您可以使用--show signature选项在git log的输出中显示这些签名: $ git log --show-signature commit 93bd0a7529ef347f8dbca7efde43f7e99ab89515 gpg: Signature made Fri 28 Jun 2013 02:28:41 PM EDT using RSA

使用较新版本的
git
,可以使用PGP密钥对单个提交(以及标记)进行签名:

git commit -m "some message" -S
您可以使用
--show signature
选项在
git log
的输出中显示这些签名:

$ git log --show-signature
commit 93bd0a7529ef347f8dbca7efde43f7e99ab89515
gpg: Signature made Fri 28 Jun 2013 02:28:41 PM EDT using RSA key ID AC1964A8
gpg: Good signature from "Lars Kellogg-Stedman <lars@seas.harvard.edu>"
Author: Lars Kellogg-Stedman <lars@seas.harvard.edu>
Date:   Fri Jun 28 14:28:41 2013 -0400

    this is a test
$git日志--显示签名
提交93bd0a7529ef347f8dbca7efde43f7e99ab89515
gpg:签名于2013年6月28日星期五下午02:28:41使用RSA密钥ID AC1964A8进行
gpg:来自“Lars Kellogg Stedman”的良好签名
作者:Lars Kellogg Stedman
日期:2013年6月28日星期五14:28:41-0400
这是一个测试

但是除了将
git log
的输出变灰外,还有没有其他方法可以通过编程验证给定提交上的签名呢?我正在寻找git tag-v的commit等价物,它将提供一个退出代码,指示给定commit上是否有有效的签名。

对代码的粗略检查表明,没有这样的直接方法

git源代码中的所有测试都依赖于
grep
ping
git show
的输出(有关测试,请参阅)

您可以使用类似于
--pretty”%H%G?%%“
的方法自定义输出,以便于解析


您似乎可以要求
git merge
验证签名,但其测试同样依赖于
grep
(请参阅)。看起来一个无效的签名会导致
git merge
以一个错误的签名退出,所以你今天可能会通过在某个地方进行测试合并并抛出该合并来绕过这个问题,但这似乎比调用grep更糟糕。

以防有人通过搜索引擎访问此页面,和我一样:在问题发布后的两年中,新工具已经面世:现在有了用于此任务的git命令:
git verify commit
git verify tag
可以分别用于验证提交和标记。

注意:最多到git 2.5,并且只显示人类可读的消息。
如果您想自动化检查,git 2.6+(2015年第三季度)会添加另一个输出

参见,,,,(2015年6月21日)作者。
(于2015年8月3日合并)

验证标记
/
验证提交
:添加选项以打印原始gpg状态信息
verify标记
/
verify commit
默认情况下显示标准错误的可读输出。
但是,访问原始gpg状态信息也很有用,它是机器可读的,允许自动执行签名策略

添加一个
--raw
选项
以使
验证标签
生成标准错误的gpg状态信息,而不是人类可读的格式

加上:

verify tag
如果签名正确但密钥无效,则成功退出 不可信<代码>验证提交退出失败。
这种行为上的差异是意想不到的,也是不必要的。
由于先前存在
verify tag
,因此添加一个失败的测试以使
verify commit
共享
verify tag
的行为


git 2.9(2016年6月)更新:

参见(2016年5月13日)作者。
帮助人:。
(于2016年5月17日被合并)

验证正在合并的分支的tip commit是否使用有效密钥签名,即具有有效uid的密钥:在默认信任模型中,这意味着签名密钥已由受信任密钥签名。
如果未使用有效密钥对分支的tip commit进行签名,则合并将中止


更新Git 2.10(2016年第3季度)

参见作者(2016年8月16日)
(于2016年8月19日被合并)

gpg接口
:在验证pgp签名时,首选“长”密钥格式输出 “
git log--show signature
”和其他显示PGP签名验证状态的命令现在显示较长的密钥id,就像上世纪32位密钥id一样

Linus的原始版本被重新调整为适用于维护轨道,以防陷入过去的二进制发行商想要将其带到旧的代码库中


Git 2.11+(2016年第4季度)将更加精确

参见作者(2016年10月12日)
(于2016年10月26日合并)

%G?
”格式说明符中显示的GPG验证状态不够丰富,无法区分由过期密钥生成的签名和由已撤销密钥生成的签名等。
已指定新的输出字母来表示它们

根据:

对于每个签名,只会发出一个代码
GOODSIG
BADSIG
EXPSIG
EXPKEYSIG
REVKEYSIG
ERRSIG

目前的方案包括:

  • %G?
    ”:显示
  • G
    ”用于良好(有效)签名
  • B
    ”对于错误的签名
  • U
    ”对于有效性未知的良好签名
  • X
    ”对于已过期的有效签名
  • Y
    ”对于由过期密钥生成的良好签名
  • R
    ”对于由已撤销密钥生成的良好签名
  • E
    ”如果无法检查签名(例如缺少密钥) 和“
    N
    ”表示无签名

Git 2.12(2017年第1季度)“
Git标签
”和“
Git验证标签
学会了将GPG验证状态置于其“
--format=
”输出格式中

参见(2017年1月17日)作者 参见(2017年1月17日)作者 (于2017年1月31日被合并)

--format
添加到
git-tag-v
将禁用GPG的默认输出 验证并打印格式化的标记对象。
这允许调用者使用交叉检查来自REF/tags的标记名 GPG验证时标记名从标记对象标题中删除


Git 2.16(2018年第1季度)将允许提交签名
--verify-signatures:
--no-verify-signatures:
merge.verifySignatures:
- TRUST_UNDEFINED <error_token>
- TRUST_NEVER     <error_token>
- TRUST_MARGINAL  [0  [<validation_model>]]
- TRUST_FULLY     [0  [<validation_model>]]
- TRUST_ULTIMATE  [0  [<validation_model>]]